表示层次数据的.NET WinForms

5
我该如何表示以下层次数据?如果可能,使用哪种控件,示例将有所帮助。
-node 
-----node1 - -data--data --data
-------------node111 -- data -- data
-------------node112 -- data -- data
-------------node113 -- data -- data
-----node2 - -data--data --data
-------------node1121 -- data -- data
-----node3 - -data--data --data

如果可能的话,我需要在大多数单元格中放置几个图标。

我找到了这个教程链接,是否有人可以提供更多信息?

如果可以的话,如何实现?

非常感谢。


这里的一个关键问题可能是:您是否正在寻找一种在代码中定义“纯数据结构”的答案:独立于任何现有的WinForms控件或第三方控件。或者,您是否愿意接受使用现有或第三方控件的答案?请参见我对Lokey答案的评论。 - BillW
3个回答

3
内置的Windows Forms控件对此并不理想。实际上,您正在寻找的是树网格混合控件(也称为多列树视图或TreeList)。
DevExpress拥有一个XtraTreeList,这是我使用的(非免费),可能是最接近您要求的。如果您正确设置了分组,Telerik的GridView也可以以分层方式显示网格数据。
如果这些价格太高,您可以尝试FlexibleTreeView。或者,如果您迫切需要免费的东西,请查看这个CodeProject页面:Advanced TreeView for .NET。它将比商业产品更加古怪和难以使用,但它能完成工作。
请注意,我假设数据是统一的,即您基本上希望在层次结构中的每个节点显示相同的数据。如果数据是异构的(根据节点或级别的类型完全不同的列),则实际上要使用的是分层GridView。您可以从上面列出的同一出版商那里获得它们。我不知道是否有任何像样的免费版本。

1
一种方法可能是创建一个派生的TreeNode对象,强制它包含一个List<data>
// requires declaration of : using System.Windows.Forms;

// sample data class
public class data
{
    public string Name;
    public int ID;
}

public class XTreeNode : TreeNode
{
    List<data> theData = new List<data>();

    public XTreeNode(string theNodeID)
    {
        this.Text = theNodeID;
    }

    public void addData(data newData)
    {
        theData.Add(newData);
    }
}

以下是一个(不太优雅的)示例,展示如何构建上述数据结构的实例(在WinForm上):假设您有一个名为“treeView1”的TreeView控件,位于窗体上:
    XTreeNode currentNode;
    data currentData;

    for (int i = 0; i < 10; i++)
    {
        // create the node and add it to the 'treeView1
        currentNode = new XTreeNode(i.ToString());
        treeView1.Nodes.Add(currentNode);

        // add some data entries to the List<data> of the derived TreeNode
        currentData = new data {Name = "one", ID = 100};
        currentNode.addData(currentData);

        currentData  = new data { Name = "two", ID = 200 };
        currentNode.addData(currentData);

        currentData = new data { Name = "three", ID = 300 };
        currentNode.addData(currentData);

        // sample of adding a child node
        currentNode.Nodes.Add(new XTreeNode((i * 100).ToString()));
    }

关于如何可视化显示与每个节点相关联的List<data>的问题:通常的方法是将Treeview与ListView结合起来,并同步它们的位置和项高度:然后在相应的TreeNode的同一“行”上显示List<data>
当然,您可以实现自己的Node和NodeCollection实体,这些实体完全独立于任何控件:这个示例展示了依赖于.NET控件作为数据结构和呈现机制的混合案例。
CodeProject上有一个非常好的组合TreeView/ListView的示例,多年来一直得到维护、更新和扩展:Phillip Piper的:"A Much Easier to Use ListView",首次发布于2006年,最近更新于2009年10月:它的功能非常丰富,我认为与商业组件相比具有很大优势。

1
使用TreeView控件

在TreeView控件中,我如何在每个节点中放置多个图标?并与GridControl结合使用? 如上所述,仅返回翻译后的文本。 - Night Walker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接