2012-05-30 7 views
5

गतिशील रूप से पॉप्युलेट कैसे करें मेरे पास 3 कॉलम, आईडी, नाम और अभिभावक के साथ एक तालिका है। आईडी कॉलम में चलने वाली संख्या होती है जो प्राथमिक कुंजी के रूप में भी कार्य करती है। आईडी नोड का नाम गुण भी होगा। नाम कॉलम में स्ट्रिंग होती है जो ट्रीनोड की टेक्स्ट विशेषता होगी, जबकि पेरेंट आईडी एक कॉलम में नोड की मूल आईडी है।वृक्षारोपण (सी #)

यह कैसे मेरे मेज की तरह लग रहा है:

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

यह तालिका दर्शाती है कि नोड नोड A1 और A2 के लिए माता-पिता नोड है। "0" के बराबर अभिभावक का अर्थ है कि नोड का अभिभावक रूट नोड (हार्डकोडेड) है। उदा।, नोड ए, बी और सी रूट नोड के बच्चे हैं।

मैं वृक्षदृश्य को पॉप्युलेट करने से पहले पेरेंट आईडी द्वारा पंक्तियों को सॉर्ट करता हूं।

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

सब कुछ ठीक है जब तक मैं खींचें और छोड़ें नोड एक बच्चा बनाकर नोड्स: मैं इन दोनों तरीकों का उपयोग कर (TreeNode यहाँ नोड childnode कि पेड़ डाला जा रहा है है) ट्री दृश्य को पॉप्युलेट नोड सी के और डेटाबेस में परिवर्तन प्रतिबद्ध करते हैं।

अब मेरी डेटाबेस तालिका इस प्रकार है:

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

अगली बार मैं एप्लिकेशन को चलाने के लिए, यह पेड़ में नोड A1 और A2 को भरने के लिए है क्योंकि यह उनके माता-पिता नहीं पा सके विफल रहता है। इसका कारण यह है कि जब मैं पहले treeview को आबाद करने के लिए ParentID के आधार पर पंक्तियों को सॉर्ट, पंक्तियों इस तरह हल कर रहे हैं:

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

इस तरह, अपने आवेदन भी नोड से पहले पेड़ में A1 और A2 नोड्स को पॉप्युलेट करने की कोशिश करेंगे ए बनाया गया है। इसलिए एप्लिकेशन को नोड ए 1 और ए 2 के लिए पैरेंट नहीं मिला।

इसलिए, क्या कोई मुझे इस बग को ठीक करने का तरीका बता सकता है या क्या एक वृक्षदृश्य गतिशील रूप से पॉप्युलेट करने का एक बेहतर तरीका है?

धन्यवाद।

+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