2012-05-30 64 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