powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как правильно построить TreeView?
4 сообщений из 4, страница 1 из 1
Как правильно построить TreeView?
    #35492770
NoNameR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Есть таблица со следующими полями:

Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE table1 
(ID bigint not null identity,
OwnerID bigint null,
NodeName nvarchar( 200 ),
NodeLevel bigint)


OwnerID - это ID владельца текущей ноды
Level - уровень, на котором находится нода (от 0 и больше)


Делаю SELECT * FROM table1 ORDER BY ID, NodeLevel


А как правильно отобразить эту иерархию в TreeView? Пробегать по каждой строке и строить ноду или можно как-то по-другому выполнить задачу?
...
Рейтинг: 0 / 0
Как правильно построить TreeView?
    #35496146
koJIo6ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну что построил дерево?
...
Рейтинг: 0 / 0
Как правильно построить TreeView?
    #35496212
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
private void Test()
{
    DataTable dt = new DataTable();
    BindingSource bindingSource = new BindingSource();
    bindingSource.DataSource = dt;

    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("Value", typeof(string));
    dt.Columns.Add("Parent_Id", typeof(int));

    dt.Rows.Add(1, "value1", 0);
    dt.Rows.Add(2, "value2", 0);
    dt.Rows.Add(3, "value3", 0);
    dt.Rows.Add(4, "value4", 1);
    dt.Rows.Add(5, "value5", 1);
    dt.Rows.Add(6, "value6", 1);
    dt.Rows.Add(7, "value7", 2);
    dt.Rows.Add(8, "value8", 3);
    dt.Rows.Add(9, "value9", 3);
    dt.Rows.Add(10, "value10", 7);

    // 1 способ - с рекурсией (красивее)
    FillTreeView(treeView1, dt);

    // 2 способ - без рекурсии (чуточку шустрее)
    FillTreeView2(treeView1, bindingSource);

}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
// ***************** 1 способ ***********************************************************

/// <summary>
///  Заполнение дерева из БД
/// </summary>
/// <param name="treeView"></param>
/// <param name="dt"></param>
private void FillTreeView(TreeView treeView, DataTable dt)
{
    treeView.Nodes.Clear();
    DataRow[] rows = dt.Select("Parent_Id = 0");
    foreach (DataRow row in rows)
    {
        TreeNode node = new TreeNode(row["Value"].ToString());
        node.Tag = row["Id"];
        treeView.Nodes.Add(node);
        FillNode(node, dt);
    }
}

/// <summary>
///  Добавление к ноде чилдов
/// </summary>
/// <param name="parentNode"></param>
/// <param name="dt"></param>
private void FillNode(TreeNode parentNode, DataTable dt)
{
    DataRow[] rows = dt.Select(string.Format("Parent_Id = {0}", parentNode.Tag));
    foreach (DataRow row in rows)
    {
        TreeNode treeNode = new TreeNode(row["Value"].ToString());
        treeNode.Tag = row["Id"];
        parentNode.Nodes.Add(treeNode);
        FillNode(treeNode, dt);
    }
}


// ***************** 2 способ ***********************************************************

/// <summary>
///  Заполнение дерева из БД
/// </summary>
/// <param name="treeView"></param>
/// <param name="bindingSource"></param>

private void FillTreeView2(TreeView treeView, BindingSource bindingSource)
{
    treeView.Nodes.Clear();
    bindingSource.Position = 0;
    for (int i = 0; i < bindingSource.Count; i++)
    {
        //Application.DoEvents();
        DataRow dr = (bindingSource.Current as DataRowView).Row;

        int id = Convert.ToInt32(dr["id"]);
        int parent_id = Convert.ToInt32(dr["parent_id"]);
        string name = dr["value"].ToString();

        if (parent_id == 0)
            treeView.Nodes.Add(FillNode(id, name));
        else
        {
            TreeNode[] treeNodes = treeView.Nodes.Find(parent_id.ToString(), true);
            if (treeNodes.Length != 0)
                (treeNodes.GetValue(0) as TreeNode).Nodes.Add(FillNode(id, name));
        }
        bindingSource.MoveNext();
    }
}

/// <summary>
/// Создание новой ноды
/// </summary>
/// <param name="id"></param>
/// <param name="name"></param>
/// <returns>TreeNode</returns>
private TreeNode FillNode(int id, string name)
{
    TreeNode treeNode = new TreeNode();
    treeNode.Tag = id;
    treeNode.Name = id.ToString();
    treeNode.Text = name;
    return treeNode;
}
...
Рейтинг: 0 / 0
Как правильно построить TreeView?
    #35496564
NoNameR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за решения =)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как правильно построить TreeView?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]