2012-05-30 13 views
5

私は、3つの列、ID、名前、およびParentIDを持つテーブルを持っています。 ID列には、主キーとしても機能する実行番号が含まれています。 IDはノードの名前のプロパティになります。名前列には、treenodeのテキスト属性になる文字列が含まれ、ParentIDにはノードの親IDが含まれます。このテーブルには、ノードAがノードA1とA2の親ノードであることを示しているツリービュー(C#)を動的に設定する方法

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

これは次のように私のテーブルがどのように見えるかです。 ParentIDが "0"に等しいとは、ノードの親がルートノード(ハー​​ドコード)であることを意味します。例えば、ノードA、BおよびCはルートノードの子である。

ツリービューを設定する前にParentIDで行をソートします。私は、ノードAに子供を作ることによって、ノードをドラッグアンドドロップするまで、すべてがうまく

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); 
      } 
     } 
    } 

:私はこれらの2つの方法を(ここでのTreeNodeノードがツリーに移入されている子ノードである)を使用して、ツリービューを移入しますノードCの変更をコミットし、変更をデータベースにコミットします。

今私のデータベーステーブルは次のようになります。それは彼らの親を見つけることができなかったので、

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

私はアプリケーションを実行する次回は、それが木にノードA1とA2を取り込むことができません。

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

このやり方は、私のアプリケーションでもノードの前の木にA1とA2のノードを移入しようとします:私は前にツリービューを移入するのParentIDに基づく行をソートする場合、行は次のようにソートされているためです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

関連する問題