2012-05-30 4 views
5

У меня есть таблица с тремя столбцами, ID, Name и ParentID. В столбце Идентификатор содержится номер запуска, который также служит в качестве первичного ключа. Идентификатором будет также имя . Название. В столбце «Имя» содержится строка, которая будет атрибутом twnode Text, в то время как ParentID - это столбец, содержащий родительский идентификатор узла.Как динамически заполнять treeview (C#)

Это как моя таблица выглядит следующим образом:

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

Эта таблица показывает, что узел А родительский узел для узла А1 и А2. 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); 
      } 
     } 
    } 

Все хорошо, пока я не перетащить и падение узлов, делая узел А ребенок узла C и зафиксировать изменения в базе данных.

Теперь моя таблица базы данных выглядит следующим образом:

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

В следующий раз, когда я запустить приложение, оно не заселить узел А1 и А2 в дерево, потому что он не мог найти своих родителей. Это происходит потому, что когда я сортирую строки на основе ParentID до заполнения TreeView, строки сортируются так:

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

Смежные вопросы