【问题标题】:Populate XtraTreeList with dynamic nodes使用动态节点填充 XtraTreeList
【发布时间】:2014-09-06 22:55:27
【问题描述】:

我有两列的表格:

+-------------+------------+  
| Level       | Desc       |  
+-------------+------------+  
| 1           | a          |  
+-------------+------------+    
| 2           | b          |  
+-------------+------------+ 
| 2           | c          | 
+-------------+------------+    
| 1           | d          |  
+-------------+------------+ 
| 2           | e          | 
+-------------+------------+    
| 2           | f          |  
+-------------+------------+ 
| 3           | g          | 
+-------------+------------+    
| 1           | h          |  
+-------------+------------+ 
| 1           | i          | 
+-------------+------------+ 
| 2           | j          |  
+-------------+------------+ 
| 2           | k          | 
+-------------+------------+ 

我需要根据 Level 列在 XtraTreeview 中用两列创建此数据的显示,它应该是这样的:

- 1 a
   -- 2 b
   -- 2 c
 -1 d
   -- 2 e
   -- 2 f
      -- 3 g
 -1 h
 -1 i 
   -- 2 j 
   -- 2 k

因此,级别列代表节点。 1级是主节点,2级是1级的子节点,3级是2级的子节点,4级是3级的子节点…… 我知道当有固定数量的节点和子节点时如何填充 Xtratreeview,但在这种情况下不知道如何填充 1 个节点包含 3、4 个或更多子节点的位置。

到目前为止我已经这样做了:

填充树视图:

DataTable table = new DataTable();
        table.Columns.Add("Level");
        table.Columns.Add("Data");

        table.Rows.Add(1, "a");
        table.Rows.Add(2, "b");
        table.Rows.Add(2, "c");
        table.Rows.Add(1, "d");
        table.Rows.Add(2, "e");
        table.Rows.Add(2, "f");
        table.Rows.Add(3, "g");
        table.Rows.Add(4, "z");
        table.Rows.Add(5, "x");
        table.Rows.Add(2, "h");
        table.Rows.Add(3, "i");
        table.Rows.Add(1, "j");
        table.Rows.Add(2, "k");

        TreeListNode rootNode = null;

        for (int i = 0; i < table.Rows.Count; i++)
        {
            tl.BeginUnboundLoad();

            TreeListNode parentForRootNodes = null;

            if (table.Rows[i][0].ToString().Equals("1"))
            {
                rootNode = tl.AppendNode(new object[] { (string)table.Rows[i][1] }, parentForRootNodes);
            }


            if (table.Rows[i][0].ToString().Equals("2"))
            {
                tl.AppendNode(new object[] { (string)table.Rows[i][1] }, rootNode);
            }

            tl.EndUnboundLoad();
        }

创建列:

 private void CreateColumns2(TreeList tl)
    {
        tl.BeginUpdate();
        tl.Columns.Add();
        tl.Columns[0].Caption = "Level";
        tl.Columns[0].VisibleIndex = 0;
        tl.Columns.Add();
        tl.Columns[1].Caption = "Desc";
        tl.Columns[1].VisibleIndex = 1;
        tl.Columns.Add();
        tl.EndUpdate();
    }

【问题讨论】:

  • 对我来说就像家庭作业。你都尝试了些什么?给我们看一些代码。
  • 为什么闻起来像作业?作业通常是一个抽象的问题。这个问题指的是一种特定的技术,所以听起来它有特定的目的。
  • 我用我为填充树视图而编写的代码编辑了我的问题。正如我所解释的,问题是没有 parentid 列。级别列代表节点。 1级为主节点,2级为1级子节点,3级为2级子节点,4级为3级子节点...
  • 编辑您的 DataRows 以获得父 ID,您应该没问题。您可以使用数据源而不是您在此处显示的未绑定加载方法(更简单..)
  • 无法编辑表并添加另一列,因为我正在访问不是由我创建的已经完成的表 :( 我已经为经典 TreeView 解决了同样的问题,它工作正常,但我不知道如何将相同的解决方案应用于 XtraTreeView。

标签: c# xtratreelist


【解决方案1】:

您可能想阅读的文档在这里:https://documentation.devexpress.com/#windowsforms/CustomDocument198

一棵树至少需要三样东西:

  • 身份证
  • 父母身份
  • 文字

因此,您描述的结构需要更改以允许找到项目的父项。

一旦你有了它,这个概念就变成了这样:

  • 为树中所需的每个节点创建一个项目,我为此创建了自己的类,并使用我想要的属性(Id、ParentId、Text...)
  • 然后设置树形控件的数据源

例子:

var data = new List<TreeItem>
{
    new TreeItem { Id = "L1_1", ParentId = "", Text = "ONE" },
    new TreeItem { Id = "L1_2", ParentId = "", Text = "TWO" },
    new TreeItem { Id = "L1_3", ParentId = "", Text = "THREE" },
    new TreeItem { Id = "L2_1", ParentId = "L1_1", Text = "A" },
    new TreeItem { Id = "L2_2", ParentId = "L1_1", Text = "B" },
    new TreeItem { Id = "L2_3", ParentId = "L1_2", Text = "C" },
    new TreeItem { Id = "L2_4", ParentId = "L1_2", Text = "D" },
    new TreeItem { Id = "L2_5", ParentId = "L1_2", Text = "E" }
};

tree.Properties.DataSource = data;

}

class TreeItem
{
    public string Id { get; set; }
    public string ParentId { get; set; }
    public string Text { get; set; }
}

数据源中item的顺序无关紧要,重要的是每个id的唯一性。

上面的例子产生了这样一棵树:

- ONE
-- A
-- B
- TWO
- THREE
-- C
-- D
-- E

我在没有安装 DevExpress 和编译器的情况下执行此操作,所以请原谅任何错误。但是概念保持不变。

【讨论】:

    猜你喜欢
    • 2014-08-13
    • 2014-09-22
    • 1970-01-01
    • 2011-08-25
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2016-07-11
    相关资源
    最近更新 更多