Заполните 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 и без компилятора, поэтому прошу прощения за любые ошибки. однако концепция остается прежней.