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

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

Код: 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
20.08.2008, 09:41
    #35496146
koJIo6ok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно построить TreeView?
ну что построил дерево?
...
Рейтинг: 0 / 0
20.08.2008, 10:18
    #35496212
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно построить TreeView?
Код: 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
20.08.2008, 11:57
    #35496564
NoNameR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно построить TreeView?
Спасибо за решения =)
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как правильно построить TreeView? / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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