Рекурсия в Treeview, загрузка полного дерева
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Рекурсия в Treeview, загрузка полного дерева Expand / Collapse
Автор
Сообщение
14.11.2006 15:59
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

администратор
Last Login: 13.11.2007 13:41
Сообщ.: 4 421, Visits: 49 251
подскажите примером куда впихнуть рекурсию в след. дело.

есть DataSet с полным деревом вида


LEVEL1
——Level2
——Level2
————Level3
——Level2
——Level2
LEVEL1
——Level2
LEVEL1

надо сформировать полное дерево в Treeview

сделал


System.Data.DataSet tabs = ....
LoadNodes(tabs, 0);

private void LoadNodes(DataSet tabs, int x)
{

    int parentid = -1;
    int parentTabLevel = 0;

    for (int i = x; i < tabs.Tables[0].Rows.Count; i++)
    {
        DataRow r = tabs.Tables[0].Rows[i];

        if ((int)r["TabLevel"] == 1)
        {   
            TreeNode root = new TreeNode();
            // Create a root node
            root.Text = r["TabName"].ToString();
            root.NavigateUrl = "~/default.aspx?TabId=" + r["TabId"].ToString();
            root.Expanded = false;
            TreeView1.Nodes.Add(root);
            parentTabLevel = (int)r["TabLevel"];
            parentid++;
        }
        else
        {
            if ((int)tabs.Tables[0].Rows[i]["TabLevel"] > parentTabLevel) //> 1
            {
                DataRow r2 = tabs.Tables[0].Rows[i];
                TreeNode child = new TreeNode();
                child.Text = r2["TabName"].ToString();
                child.NavigateUrl = "~/default.aspx?TabId=" + r2["TabId"].ToString();
                TreeView1.Nodes[parentid].ChildNodes.Add(child);
               
            }
        }

     }    
}

что грузит только первый и второй уровни правильно, а третий показывает как второй (т.е. неверно). уровней может быть больше чем три.... в поле TabLevel определен уровнь ветки - 1, 2, 3...

Сообщ. #907473
14.11.2006 17:38
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 27.02.2008 16:42
Сообщ.: 43, Visits: 1 569
Прoблемa, видимo, в тoм чтo parentid oпределяется тoлькo для первoгo урoвня.
Сообщ. #907480
14.11.2006 18:50
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Какие именно поля есть в таблице? Элементы дерева идут в порядке вложенности или вразброс?
Сообщ. #907483
14.11.2006 21:20
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

администратор
Last Login: 13.11.2007 13:41
Сообщ.: 4 421, Visits: 49 251
Элементы дерева идут в порядке вложенности

т.е. из базы возвращается "готовое" дерево


LEVEL1
——Level2
——Level2 (имеет вложенность)
————Level3
——Level2
——Level2
LEVEL1
——Level2
LEVEL1

как видно, выступающий Level3 принадлежит именно предыдущей ветке Level2

физически это выглядит так


TabId  TabLevel  TabName 
---------------------------
1        1            компьютеры
2        2            ——промышленные
3        2            ——портативные
4        3            ————до 1 кг
5        2            ——настольные
6        2            ——серверы
7        1            принтеры
8        2            ——лазерные
9        1            факсы
 
Сообщ. #907487
14.11.2006 21:52
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 27.02.2008 16:42
Сообщ.: 43, Visits: 1 569
private void LoadNodes(DataSet tabs, int x)
{

    int parentid = -1;
    int parentTabLevel = 0;

    for (int i = x; i < tabs.Tables[0].Rows.Count; i++)
    {
        DataRow r = tabs.Tables[0].Rows[i];

        parentid=int.Parse(r["TabId"].ToString());
       

        if ((int)r["TabLevel"] == 1)
        {   
            TreeNode root = new TreeNode();
            // Create a root node
            root.Text = r["TabName"].ToString();
            root.NavigateUrl = "~/default.aspx?TabId=" + r["TabId"].ToString();
            root.Expanded = false;
            TreeView1.Nodes.Add(root);
            parentTabLevel = (int)r["TabLevel"];
        }
        else
        {
            if ((int)tabs.Tables[0].Rows[i]["TabLevel"] > parentTabLevel) //> 1
            {
                DataRow r2 = tabs.Tables[0].Rows[i];
                TreeNode child = new TreeNode();
                child.Text = r2["TabName"].ToString();
                child.NavigateUrl = "~/default.aspx?TabId=" + r2["TabId"].ToString();
                TreeView1.Nodes[parentid].ChildNodes.Add(child);
               
            }
        }

     }    
}

Сообщ. #907489
15.11.2006 1:35
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

администратор
Last Login: 13.11.2007 13:41
Сообщ.: 4 421, Visits: 49 251
блин не могу загрузить проект в студии. в последнее время такая гадость все чаще и чаще, ни у кого случайно решения нет? переставить ее что ли...

утром проверю...

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

Сообщ. #907490
15.11.2006 9:30
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 04.08.2008 12:56
Сообщ.: 118, Visits: 1 576
Перефразирую вопрос bazile: поле TabId идентично значению i в цикле, не нарушена ли сортировка в датасете?
Сообщ. #907495
15.11.2006 15:30
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

администратор
Last Login: 13.11.2007 13:41
Сообщ.: 4 421, Visits: 49 251
tabid не идентично значению i в цикле

код от MFisher не работает, т.к. parentid выходит за пределы кол-ва родителей
если точнее, то

Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

происходит в строке

TreeView1.Nodes[parentid].ChildNodes.Add(child);

Сообщ. #907540