Заполните XtraTreeList динамическими узлами

У меня есть таблица с двумя столбцами:

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

И мне нужно создать отображение этих данных в 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, когда существует фиксированное количество узлов и подузлов, но в этом case не имеет представления, как заполнять, где 1 узел состоит из 3, 4 или более подузлов.

Я сделал это до сих пор:

Заполнить TreeView:

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

1 ответ

Документация, которую вы хотели бы прочитать, находится здесь: https://documentation.devexpress.com/

Вам нужно как минимум три вещи для дерева:

  • Я бы
  • ParentId
  • Текст

Таким образом, структуру, которую вы описали, нужно изменить, чтобы разрешить поиск родителя для элемента.

Если у вас есть это, концепция выглядит следующим образом:

  • Создайте элемент для каждого узла, который вы хотите в дереве, я создал для этого свой собственный класс со свойствами, которые я хотел (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; }
}

Порядок элементов в источнике данных не имеет значения, важна уникальность каждого идентификатора.

Приведенный выше пример создает дерево, подобное этому:

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

Я делаю это без установки DevExpress и без компилятора, поэтому прошу прощения за любые ошибки. однако концепция остается прежней.

Другие вопросы по тегам