C#WinForms从列表填充TreeView<;myObj>;
本文关键字:lt myObj gt TreeView 列表 填充 C#WinForms | 更新日期: 2023-09-27 18:29:36
我有这样的类结构:
public class L3Message
{
public int Number { get; set; }
public string MessageName { get; set; }
public string Device { get; set; }
public string Time { get; set; }
public string ScramblingCode { get; set; }
public List<Parameter> Parameters { get; set; }
public L3Message()
{
Parameters = new List<Parameter>();
}
}
public class Parameter
{
public int numOfWhitespaces { get; set; }
public string ParameterName { get; set; }
public string ParameterValue { get; set; }
public Parameter Parent { get; set; }
public List<Parameter> SubParameters { get; set; }
public Parameter()
{
SubParameters = new List<Parameter>();
}
}
因此,作为我的一个方法的返回类型,我有L3Messages
(List<L3Message>
)的List
,我需要将其映射到WinForms
中的TreeView
(从该List
填充TreeView
)。
编辑:请注意,我的对象树可以比一级更深(因为类Parameter有prop List<Parmaeter>(参数对象列表,与根参数对象结构相同)),所以这意味着递归或类似的东西。
第2版:
这是树的图片,但这棵树是从基于空白的文本文件创建的,所以这是所有的参数,在我的树中,我只需要L3Message对象列表中的一个。
http://imageshack.us/photo/my-images/803/treeviewmessage.png/
第3版:
我确信我的TreeView应该是这样的:
L3Message.Number: L3Message.MessageName
+L3Message.Time
+L3Message.Device
+L3Message.ScramblingCode
+L3Message.Parameters[0]
++Parameter.ParamaeterName: Parameter.ParameterValue
++ (same as above)
L3Message.Number: L3Message.MessageName
+L3Message.Time
+L3Message.Device
+L3Message.ScramblingCode
+L3Message.Parameters[0]
++Parameter.ParamaeterName: Parameter.ParameterValue (in this occasion Value is null )
+++SubParameter.ParameterName: SubParameter.ParameterValue
类似的东西
如果可能的话,我想在单独的线程中这样做。
我怎样才能做到这一点?
这当然是可能的。现在,这取决于您希望TreeView
的结构。然后您只需要创建TreeNode
对象并将它们添加到TreeView
中。请参阅本小教程:http://www.dotnetperls.com/treeview
如果要在另一个线程上执行此操作,则需要通过使用BeginInvoke
:将更新转发到GUI线程来更新GUI
TreeNode node = new TreeNode("node");
L3Message msg = new L3Message();
node.Tag = msg;
treeView.BeginInvoke(
(Action)(() =>
{
treeView.Nodes.Add(node);
}));
请注意,TreeNode
需要使用代表名称的string
创建,然后可以使用Tag
属性添加它指向的对象。
我设法解决了这个问题,但我认为这不是优化的,也没有单独的线程。如果有人可以修改我的代码以更好地执行并添加单独的线程?
解决方案:
foreach (L3Message message in por)
{
treeViewMessages.Nodes.Add(message.Number + ": " + message.MessageName);
treeViewMessages.Nodes.Add("Time: " + message.Time);
treeViewMessages.Nodes.Add("MS: " + message.Device);
treeViewMessages.Nodes.Add("Scrambling Code: " + message.ScramblingCode);
foreach (Parameter param in message.Parameters)
{
TreeNode tnRootParam = new TreeNode();
//tnRootParam.Nodes.Add(param.ParameterName + ": " + param.ParameterValue);
if (param.SubParameters.Count != 0)
{
CreateTreeNodes(param, tnRootParam);
tnRootParam.Text = param.ParameterName;
treeViewMessages.Nodes.Add(tnRootParam);
}
else
{
tnRootParam.Text = param.ParameterName + ": " + param.ParameterValue;
treeViewMessages.Nodes.Add(tnRootParam);
}
}
treeViewMessages.Nodes.Add("---------------------------------------------------------------------");
}
private void CreateTreeNodes(Parameter parameter, TreeNode tnRootParam)
{
if (parameter.SubParameters.Count == 0)
{
tnRootParam.Nodes.Add(parameter.ParameterName + ": " + parameter.ParameterValue);
}
else
{
foreach (Parameter subparam in parameter.SubParameters)
{
CreateTreeNodes(subparam, tnRootParam);
}
}
}