2012-05-30 60 views
5

我有一個3列,ID,名稱和ParentID表。 ID列包含運行號碼,該號碼也是主鍵。 ID也將是節點的名稱屬性。名稱列包含字符串,該字符串將是treenode的文本屬性,而ParentID是包含節點的父ID的列。如何動態填充treeview(C#)

這是我的表看起來像:

ID  Name ParentID 
====================== 
1  A  0 
2  A1  1 
3  B  0 
4  C  0 
5  A2  1 
6  B1  3 

該表顯示,節點A是節點A1和A2的父節點。 ParentID等於「0」表示節點的父節點是根節點(硬編碼)。例如,節點A,B和C是根節點的子節點。

我在填充樹視圖之前按ParentID對行進行排序。我填充使用這兩種方法(這裏TreeNode的節點是被填充到樹childnode)樹視圖:

private void SearchParent(TreeView tree, String parentID, TreeNode node) 
    { 
     // Post: call TraverseParent method to search parent 

     TreeNodeCollection collection = tree.Nodes; 

     // Search parent recursively 
     foreach (TreeNode n in collection) 
     { 
      TraverseParent(n, parentID, node); 
     } 
    } 

    private void TraverseParent(TreeNode potentialParent, String parentID, TreeNode node) 
    { 
     // Post: search for parent. When parent is found add child to parent 

     // am i the parent that you're looking for? 
     if (parentID.CompareTo(potentialParent.Name) == 0) 
     { 
      // found me! i'm your parent! 

      // add child to parent 
      potentialParent.Nodes.Add(node); 

      // update that the parent for child has been found 
      parentFound = true; 
     } 
     else 
     { 
      // i'm not your parent 

      // continue to look for parent recursively 
      foreach (TreeNode n in potentialParent.Nodes) 
      { 
       TraverseParent(n, parentID, node); 
      } 
     } 
    } 

一切都很好,直到我拖和拖放通過使節點A的子節點的節點C並將更改提交到數據庫。

現在我的數據庫表看起來像這樣:

ID  Name ParentID 
====================== 
1  A  4 
2  A1  1 
3  B  0 
4  C  0 
5  A2  1 
6  B1  3 

下一次我運行應用程序時,它未能填充節點A1和A2成樹,因爲它找不到自己的父母。這是因爲當我填充樹視圖之前基於PARENTID行進行排序,行排序是這樣的:

ID  Name ParentID 
====================== 
3  B  0 
4  C  0 
2  A1  1 
5  A2  1 
6  B1  3 
1  A  4 

這樣一來,我的應用程序將嘗試甚至節點之前填充A1和A2節點到樹A被創建。因此,應用程序找不到節點A1和A2的父節點。

因此,誰能告訴我一種方法來解決這個錯誤,或者有沒有更好的方式來動態填充樹視圖?

謝謝。

+1

看到這裏 - http://stackoverflow.com/questions/361661/populate-treeview-from-database –

+0

謝謝你的鏈接! – ixora

回答

14

你應該使用遞歸來填充它。

承諾的例子:

public partial class Form1 : Form 
    { 
     private class ItemInfo 
     { 
      public int ID; 
      public int ParentID; 
      public string Name; 
     } 

     public Form1() 
     { 
      InitializeComponent(); 
      FillTreeView(); 
     } 

     private void FillTreeView() 
     { 
      var items = new List<ItemInfo>() 
      { 
       new ItemInfo(){ID = 1, ParentID = 4, Name = "A"}, 
       new ItemInfo(){ID = 2, ParentID = 1, Name = "A1"}, 
       new ItemInfo(){ID = 3, ParentID = 0, Name = "B"}, 
       new ItemInfo(){ID = 4, ParentID = 0, Name = "C"}, 
       new ItemInfo(){ID = 5, ParentID = 1, Name = "A2"}, 
       new ItemInfo(){ID = 6, ParentID = 3, Name = "B1"}, 
      }; 

      FillNode(items, null); 
     } 

     private void FillNode(List<ItemInfo> items, TreeNode node) 
     { 
      var parentID = node != null 
       ? (int)node.Tag 
       : 0; 

      var nodesCollection = node != null 
       ? node.Nodes 
       : treeView1.Nodes; 

      foreach (var item in items.Where(i => i.ParentID == parentID)) 
      { 
       var newNode = nodesCollection.Add(item.Name, item.Name); 
       newNode.Tag = item.ID; 

       FillNode(items, newNode); 
      } 
     } 
    } 
+0

太棒了,恭喜! – copa017