04. november 2008 - 11:17Der er
3 kommentarer og 1 løsning
Treeview - flere end 3 niveauer
Hej,
Jeg kører med et treeview, jeg henter fra databasen på nuværende tidspunkt. Den kører som en drøm.....MEN kun på 3 niveauer:
Niveau1 ...Niveau1-1 ......Niveau1-1-1
Jeg vil gerne udvide den til at have/vise X antal niveauer men aner ikke hvordan jeg gør det.
Min kode, hvor jeg henter menuen ind i mit treeview er følgende:
private void GetMenu() { //16-06-2008 AS //Get the top menu try { DALMenu menu = new DALMenu(); if (menu.ProdGetTopMenu(MenuTree) == Status.Success) { //Henter submenus for (int i = 0; i < MenuTree.Nodes.Count; i++) { TreeNode headnode = MenuTree.Nodes[i];
Og her henter jeg så submenus ind fra databasen: SqlDataReader reader = command.ExecuteReader();
while (reader.Read() == true) { r = AItems.NewRow();
try { TreeNode t = new TreeNode(reader["fProdPageName"].ToString(), reader["fEditPageFId"].ToString()); t.PopulateOnDemand = true; t.SelectAction = TreeNodeSelectAction.SelectExpand; t.Expanded = false;
n.ChildNodes.Add(t); } catch { }
AItems.Rows.Add(r); }
Nogen der kan fortælle mig, hvordan jeg får lavet det sådan, den henter ALLE de niveauer der end måtte være......eller bare, hvordan man tilføjer ét niveau mere?
Kan du ikke bare lave en lille rekursiv metode der løber alle noderne igennem indtil den møder en node uden "children". Se f.eks. nedenfor hvor "GetMenu()" er ændret og der desuden er tilføjet en ny "RecBuildNodes"-metode (koden er absolut utestet):
private void GetMenu() { //16-06-2008 AS //Get the top menu try { DALMenu menu = new DALMenu(); if (menu.ProdGetTopMenu(MenuTree) == Status.Success) { RecBuildNodes(MenuTree); } } catch { } }
//Henter submenus recursivt private void RecBuildNodes(TreeNode tNode) { for (int i = 0; i < tNode.Nodes.Count; i++) { TreeNode curNode = tNode.Nodes[i];
GetSubNodes(curNode);
if (curNode.ChildNodes.Count > 0) RecBuildNodes(curNode); } }
Hvis din tabel ser ud som min: [NodeID][NodeNavn][ParentID]
så kan man lave en næsten flad opdatering af et træ: //---------------------
//Hent endten med SQL eller LINQ hele din træ-tabel var AutoGenTree = from aggt in db.Autog302GenStructs orderby aggt.NodeID select aggt;
//opret et dictionary til at gemme alle dine noder (og slå op) dicAutoTree = new Dictionary<int, TreeNode>();
//ryd evt dit TreeView GenTree.Nodes.Clear();
//Skab evt en root-node eller brug GenTree.Nodes i stedet TreeNode root = new TreeNode() { Text = "root", Value = "0" }; dicAutoTree.Add(0, root); GenTree.Nodes.Add(root);
//loop igennem alle rækker i tabellen foreach (var node in AutoGenTree) { //Skab den node du vil indsætte TreeNode tn = new TreeNode(node.Name, node.NodeID.ToString());
//læg noden i dit dictionary dicAutoTree.Add(node.NodeID, tn);
//undersøg om nodens parent allerede findes i træet if (dicAutoTree.ContainsKey(node.ParentID)) { //hvis parent allerede findes, læg nogen i dens children dicAutoTree[node.ParentID].ChildNodes.Add(tn); } else { //ellers tilføj noden som root/firstnode i træet (evt dit tree.Nodes GenTree.Nodes.Add(tn); } }
Jeg er glad for at høre du fik det til at virke og ja jeg kan se du bruger den rekursive metode. :)
Der kommer et svar her.
Mvh. CS
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.