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>();
    }
}

因此,作为我的一个方法的返回类型,我有L3MessagesList<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

类似的东西

如果可能的话,我想在单独的线程中这样做。

我怎样才能做到这一点?

C#WinForms从列表填充TreeView<;myObj>;

这当然是可能的。现在,这取决于您希望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);
            }  
        }
    }