2011-01-15 11 views

Odpowiedz

15

Zakładając, że masz drzewo z jednym węzłem głównym, poniższy kod zawsze zapętnieje węzły drzew w dół do najgłębszych, a następnie cofnie się o jeden poziom wstecz i tak dalej. Wypisze tekst każdego węzła. (Nietestowane od szczytu głowy)

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

Update do odpowiedzi Krumelur użytkownika (zamiast 2 pierwsze linie jego/jej rozwiązania z tym):

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

Tak, to wypluje wszystkie poddrzewa, jeśli istnieje kilka korzeni. Ale tak naprawdę: drzewo z kilkoma węzłami jest naprawdę rzadkie :-) Aha, i to jest "jego";) – Krumelur

+0

W rzeczywistości jest to dość powszechna phaenommena :) W programowaniu mogę sobie wyobrazić kilka scenariuszy gdzie jest to przydatne. Na przykład: widok drzewa zawierający działy firmy, z których każda ma podjednostki i tak dalej. Prawdopodobnie nie będziesz mieć żadnego superdepartetu. – dzendras

+0

Masz rację. Poprawiłem odpowiedź. Był literówka. – Krumelur

6

podejścia Lazy LINQ, tak na wszelki wypadek Szukamy czegoś takiego:

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

Można użyć dwóch metod rekurencyjnego rozszerzenia. Można też zadzwonić myTreeView.GetAllNodes() lub 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

Ponieważ TreeView ma wiele poziomów, zrobić rekurencyjną funkcję:

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

niż wywołać tę funkcję dla wszystkich węzłów poziom pierwszy w TreeView:

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

Kod jest z witryny C# TreeView

1

Jeśli nie potrzebujesz klucza węzła, aby był unikalny, po prostu ustaw wszystkie klucze węzłów na pusty ciąg znaków (""), następnie możesz wykonać Treeview1.Nodes.Find("", true);, aby zwrócić wszystkie węzły w obrębie TreeView.

Powiązane problemy