从 ObjectArray 正确显示 TreeView

correct Displaying of TreeView from ObjectArray

我正在创建树视图。

public void CreateTreeView1(TableInfo[] items)
    {
        treeView1.TabStop = false;
        TreeNodeCollection nodes = treeView1.Nodes;

        for (int i = 0; i < items.Length; i++)
        {
            TreeNode newNode = new TreeNode( items[i].Schemaname+"."+items[i].Tablename);
            newNode.Tag = items[i];
            treeView1.Nodes.Add(newNode);

            for (int j = 0; j < service.GibSpaltenNamen(items[i].Tablename).Length; j++)
            {
                newNode = new TreeNode(items[i].Columnname);
                newNode.Tag = items[j];
                treeView1.Nodes[i].Nodes.Add(newNode);
            }
        } 

并且参数 TableInfo[] 是一个对象数组,其中包含:架构名称、表名称、列名称、说明。全部填满信息 但是在创建 TreeView 时没有那个意义。 我想要这样:

谢谢贾尼克
}

编辑:

 public void CreateTreeView1(TableInfo[] items)
    {
        treeView1.TabStop = false;
        TreeNodeCollection nodes = treeView1.Nodes;

        foreach (TableInfo Tvalue in items)          
        {
            TreeNode newTNode = new TreeNode(Tvalue.Schemaname + "." + Tvalue.Tablename);
            newTNode.Tag = Tvalue;
            treeView1.Nodes.Add(newTNode);


            foreach (ColumnInfo Cvalue in Tvalue.Columns)
            {
                TreeNode newCNode = new TreeNode(Cvalue.Name);
                newCNode.Tag = Cvalue;
                newTNode.Nodes.Add(newCNode);
            }
        }           
    }

这是我的解决方案...

假设 TableInfo 看起来像这样:

class TableInfo
{
    public string SchemaName { get; set; }
    public string TableName { get; set; }
    public string ColumnName { get; set; }
    public string Description { get; set; }
}

你应该先按 SchemaNameTableName 分组。那么,TreeView的构建就变得很简单了:

        treeView1.BeginUpdate();
        try
        {
            var nodes = items
                .GroupBy(_ => string.Format("{0}.{1}", _.SchemaName, _.TableName))
                .Select(_ => new TreeNode(
                    _.Key,
                    _.Select(info => new TreeNode(info.ColumnName)
                    {
                        Tag = info
                    })
                    .ToArray()))
                .ToArray();

            treeView1.Nodes.AddRange(nodes);
        }
        finally
        {
            treeView1.EndUpdate();
        }

请注意,我省略了顶级节点的 Tag 初始化,因为它们是分组节点。