2011-01-15 17 views
6

में सभी पेड़ नोड्स (सभी स्तरों में) की एक सूची प्राप्त करें TreeView नियंत्रण में मैं सभी पेड़ नोड्स (सभी स्तरों में) की सूची कैसे प्राप्त कर सकता हूं?TreeView नियंत्रण

+2

यदि आप किसी उत्तर से संतुष्ट हैं तो यह बहुत अच्छा होगा कि आपने इसे स्वीकार किया है। धन्यवाद। – Krumelur

उत्तर

15

मान लें कि आपके पास एक रूट नोड वाला पेड़ है, निम्न कोड हमेशा पेड़ नोड्स को गहरे तक लूप करेगा, फिर एक स्तर वापस जाएं और इसी तरह। यह प्रत्येक नोड के पाठ को मुद्रित करेगा। करुमेलूर के जवाब देने के लिए

TreeNode oMainNode = oYourTreeView.Nodes[0]; 
PrintNodesRecursive(oMainNode); 

public void PrintNodesRecursive(TreeNode oParentNode) 
{ 
    Console.WriteLine(oParentNode.Text); 

    // Start recursion on all subnodes. 
    foreach(TreeNode oSubNode in oParentNode.Nodes) 
    { 
    PrintNodesRecursive(oSubNode); 
    } 
} 
6

अद्यतन (मेरे सिर के ऊपर से untested है) (इस के साथ उसकी/उसके समाधान के 2 पहले लाइनों डालें):,

foreach (var node in oYourTreeView.Nodes) 
{ 
    PrintNodesRecursive(node); 
} 
+0

हाँ, तो कई जड़ें होने पर यह सभी सबट्री को थूक देगा। लेकिन वास्तव में: कई नोड्स वाला पेड़ प्रकृति में वास्तव में शायद ही कभी होता है :-) ओह, और यह "उसका" है;) – Krumelur

+0

वास्तव में, प्रकृति में यह एक आम आम फाइनोमेना है :) प्रोग्रामिंग में मैं कुछ परिदृश्यों की कल्पना कर सकता हूं जहां यह उपयोगी है। उदाहरण के लिए: वृक्षदृश्य जिसमें एक कंपनी के विभाग होते हैं, प्रत्येक में उप-विभाग होते हैं और इसी तरह। आपके पास शायद कोई सुपर डिपार्टमेंट नहीं होगा। – dzendras

+0

आप सही हैं। मैंने अपना जवाब समायोजित किया। एक टाइपो था। – Krumelur

6

लेज़ी LINQ दृष्टिकोण सिर्फ मामले में आप इस तरह कुछ ढूंढ रहे हैं:

private void EnumerateAllNodes() 
{ 
    TreeView myTree = ...; 

    var allNodes = myTree.Nodes 
     .Cast<TreeNode>() 
     .SelectMany(GetNodeBranch); 

    foreach (var treeNode in allNodes) 
    { 
     // Do something 
    } 
} 

private IEnumerable<TreeNode> GetNodeBranch(TreeNode node) 
{ 
    yield return node; 

    foreach (TreeNode child in node.Nodes) 
     foreach (var childChild in GetNodeBranch(child)) 
      yield return childChild; 
} 
12

आप दो रिकर्सिव एक्सटेंशन विधियों का उपयोग कर सकते हैं। आप कॉल कर सकते हैं या तो myTreeView.GetAllNodes() या myTreeNode.GetAllNodes():

public static List<TreeNode> GetAllNodes(this TreeView _self) 
{ 
    List<TreeNode> result = new List<TreeNode>(); 
    foreach (TreeNode child in _self.Nodes) 
    { 
     result.AddRange(child.GetAllNodes()); 
    } 
    return result; 
} 

public static List<TreeNode> GetAllNodes(this TreeNode _self) 
{ 
    List<TreeNode> result = new List<TreeNode>(); 
    result.Add(_self); 
    foreach (TreeNode child in _self.ChildNodes) 
    { 
     result.AddRange(child.GetAllNodes()); 
    } 
    return result; 
} 
-1

क्योंकि TreeView कई स्तर हैं, पुनरावर्ती क्रिया करते हैं:

public void AddNodeAndChildNodesToList(TreeNode node) 
    { 
     listBox1.Items.Add(node.Text); // Adding current nodename to ListBox  

     foreach (TreeNode actualNode in node.Nodes) 
     { 
      AddNodeAndChildNodesToList(actualNode); // recursive call 
     } 
    } 

TreeView में सभी प्रथम स्तर नोड्स के लिए इस समारोह फोन से:

foreach (TreeNode actualNode in treeView1.Nodes)   // Begin with Nodes from TreeView 
    { 
     AddNodeAndChildNodesToList(actualNode); 
    } 

कोड साइट C# TreeView

1

से है यदि आप डी नोड कुंजी को अद्वितीय होने की आवश्यकता नहीं है, बस सभी नोड कुंजियों को एक खाली स्ट्रिंग ("") पर सेट करें, फिर आप TreeView के भीतर सभी नोड्स को वापस करने के लिए Treeview1.Nodes.Find("", true); कर सकते हैं।