簡體   English   中英

使用WinForms DevExpress XtraGrid C#顯示層次結構樹

[英]Display hierarchy tree using WinForms DevExpress XtraGrid c#

我具有由以下對象組成的分層數據結構:

Class A
{
*some properties
*list<A> SubNodes
}

現在,我需要在某種視覺樹中顯示此層次結構。 我正在使用WinForms C#/您能建議我如何顯示這樣的樹嗎? Standart TreeView沒有DataSource屬性,DevExpress XtraTreeView使用具有Id / ParentID關系的DataSource純源。 我使用過XtraGrid,但無法正確配置詳細信息視圖。 您能告訴我用什么方式可以解決這個問題?

UPD

在白天的討論中,TreeList不適合我們。 因為我們需要提供XtraGrid的所有東西,包括自動篩選行和grouppanel(可以在其中拖動列進行分組)。 因此,如果沒有使用XtraGrid實現此類樹的解決方案,我應該結束這個問題。

您可以使用TreeList.IVirtualTreeListData接口。
這是示例:

public class A
{
    public A(string property0, string property1, string property2)
    {
        Property0 = property0;
        Property1 = property1;
        Property2 = property2;

        SubNodes = new List<A>();
    }

    public string Property0 { get; set; }
    public string Property1 { get; set; }
    public string Property2 { get; set; }

    public List<A> SubNodes { get; private set; }
}

public class TreeDataSource : List<A>, TreeList.IVirtualTreeListData
{
    void TreeList.IVirtualTreeListData.VirtualTreeGetChildNodes(VirtualTreeGetChildNodesInfo info)
    {
        var a = info.Node as A;

        info.Children = a.SubNodes;
    }

    void TreeList.IVirtualTreeListData.VirtualTreeGetCellValue(VirtualTreeGetCellValueInfo info)
    {
        var a = info.Node as A;

        switch (info.Column.FieldName)
        {
            case "Property0":
                info.CellData = a.Property0;
                break;
            case "Property1":
                info.CellData = a.Property1;
                break;
            case "Property2":
                info.CellData = a.Property2;
                break;
        }
    }

    void TreeList.IVirtualTreeListData.VirtualTreeSetCellValue(VirtualTreeSetCellValueInfo info)
    {
        var a = info.Node as A;

        switch (info.Column.FieldName)
        {
            case "Property0":
                a.Property0 = (string)info.NewCellData;
                break;
            case "Property1":
                a.Property1 = (string)info.NewCellData;
                break;
            case "Property2":
                a.Property2 = (string)info.NewCellData;
                break;
        }
    }
}

用法示例:

var treeDataSource = new TreeDataSource();
//Add top level nodes
treeDataSource.Add(new A("Node 0, Property 0", "Node 0, Property 1", "Node 0, Property 2"));
treeDataSource.Add(new A("Node 1, Property 0", "Node 1, Property 1", "Node 1, Property 2"));
treeDataSource.Add(new A("Node 2, Property 0", "Node 2, Property 1", "Node 2, Property 2"));
//Add subnodes for first node.
treeDataSource[0].SubNodes.Add(new A("Node 0.0, Property 0", "Node 0.0, Property 1", "Node 0.0, Property 2"));
treeDataSource[0].SubNodes.Add(new A("Node 0.1, Property 0", "Node 0.1, Property 1", "Node 0.1, Property 2"));
treeDataSource[0].SubNodes.Add(new A("Node 0.2, Property 0", "Node 0.2, Property 1", "Node 0.2, Property 2"));
//Add subnodes for second node.
treeDataSource[1].SubNodes.Add(new A("Node 1.0, Property 0", "Node 1.0, Property 1", "Node 1.0, Property 2"));
treeDataSource[1].SubNodes.Add(new A("Node 1.1, Property 0", "Node 1.1, Property 1", "Node 1.1, Property 2"));
treeDataSource[1].SubNodes.Add(new A("Node 1.2, Property 0", "Node 1.2, Property 1", "Node 1.2, Property 2"));

var treeList = new TreeList();

treeList.Columns.AddField("Property0").Visible = true;
treeList.Columns.AddField("Property1").Visible = true;
treeList.Columns.AddField("Property2").Visible = true;

treeList.DataSource = treeDataSource;

Controls.Add(treeList);
treeList.Dock = DockStyle.Fill;            

示例結果:
示例結果

有兩種推薦的綁定業務對象的方法,該方法將樹結構封裝到DevExpress TreeList中:

1)使對象適合在TreeList控件中顯示。 在這種情況下,對象必須實現DevExpress.XtraTreeList.IVirtualTreeListData接口。 有關更多信息,請參見本文
示例: 如何:為業務對象實現樹形結構

2)處理特定TreeList的事件並為根節點和子節點提供數據。 有關更多信息,請參見本文
示例: 如何:通過事件動態加載數據

如果要將XtraGrid用於層次結構,則可以使用IRelationList接口。
這是示例:

public class A
{
    public A(string property0, string property1, string property2)
    {
        Property0 = property0;
        Property1 = property1;
        Property2 = property2;

        SubNodes = new List<A>();
    }

    public string Property0 { get; set; }
    public string Property1 { get; set; }
    public string Property2 { get; set; }

    public List<A> SubNodes { get; private set; }
}

public class DataSource : List<A>, IRelationList
{
    IList IRelationList.GetDetailList(int index, int relationIndex)
    {
        return this[index].SubNodes;
    }

    string IRelationList.GetRelationName(int index, int relationIndex)
    {
        return null;
    }

    bool IRelationList.IsMasterRowEmpty(int index, int relationIndex)
    {
        return this[index].SubNodes.Count == 0;
    }

    int IRelationList.RelationCount
    {
        get { return 1; }
    }
}

用法示例:

var dataSource = new DataSource();
//Add top level nodes
dataSource.Add(new A("Node 0, Property 0", "Node 0, Property 1", "Node 0, Property 2"));
dataSource.Add(new A("Node 1, Property 0", "Node 1, Property 1", "Node 1, Property 2"));
dataSource.Add(new A("Node 2, Property 0", "Node 2, Property 1", "Node 2, Property 2"));
//Add subnodes for first node.
dataSource[0].SubNodes.Add(new A("Node 0.0, Property 0", "Node 0.0, Property 1", "Node 0.0, Property 2"));
dataSource[0].SubNodes.Add(new A("Node 0.1, Property 0", "Node 0.1, Property 1", "Node 0.1, Property 2"));
dataSource[0].SubNodes.Add(new A("Node 0.2, Property 0", "Node 0.2, Property 1", "Node 0.2, Property 2"));
//Add subnodes for second node.
dataSource[1].SubNodes.Add(new A("Node 1.0, Property 0", "Node 1.0, Property 1", "Node 1.0, Property 2"));
dataSource[1].SubNodes.Add(new A("Node 1.1, Property 0", "Node 1.1, Property 1", "Node 1.1, Property 2"));
dataSource[1].SubNodes.Add(new A("Node 1.2, Property 0", "Node 1.2, Property 1", "Node 1.2, Property 2"));
//Add subnodes for second node in fisrt subnode.
dataSource[0].SubNodes[1].SubNodes.Add(new A("Node 0.1.0, Property 0", "Node 0.1.0, Property 1", "Node 0.1.0, Property 2"));
dataSource[0].SubNodes[1].SubNodes.Add(new A("Node 0.1.1, Property 0", "Node 0.1.1, Property 1", "Node 0.1.1, Property 2"));
dataSource[0].SubNodes[1].SubNodes.Add(new A("Node 0.1.2, Property 0", "Node 0.1.2, Property 1", "Node 0.1.2, Property 2"));

var gridControl = new GridControl();

var view = new GridView(gridControl);           

gridControl.MainView = view;
gridControl.DataSource = dataSource;
gridControl.Dock = DockStyle.Fill;

view.OptionsDetail.ShowDetailTabs = false;

Controls.Add(gridControl);

示例結果:
示例結果
另外,您可以看一下《如何使用主從細節GridView模擬TreeList》示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM