|
|
|
Supreme 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...
|
|
|
|
|
Forum Member
      
участник
Last Login: 27.02.2008 16:42
Сообщ.: 43,
Visits: 1 569
|
|
| Прoблемa, видимo, в тoм чтo parentid oпределяется тoлькo для первoгo урoвня.
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| Какие именно поля есть в таблице? Элементы дерева идут в порядке вложенности или вразброс?
|
|
|
|
|
Supreme 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 факсы
|
|
|
|
|
Forum 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); } } } }
|
|
|
|
|
Supreme Being
      
администратор
Last Login: 13.11.2007 13:41
Сообщ.: 4 421,
Visits: 49 251
|
|
| блин не могу загрузить проект в студии. в последнее время такая гадость все чаще и чаще, ни у кого случайно решения нет? переставить ее что ли... утром проверю... ошибся в названии датасета - tabs он должен называться, поэтому поправил...
|
|
|
|
|
Supreme Being
      
участник
Last Login: 04.08.2008 12:56
Сообщ.: 118,
Visits: 1 576
|
|
| Перефразирую вопрос bazile: поле TabId идентично значению i в цикле, не нарушена ли сортировка в датасете?
|
|
|
|
|
Supreme 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);
|
|
|
| | |