2011-01-15 47 views

Respuesta

15

Suponiendo que tiene un árbol con un nodo raíz, el siguiente código siempre recorrerá los nodos del árbol hasta lo más profundo, luego retrocederá un nivel, y así sucesivamente. Imprimirá el texto de cada nodo. (No comprobado desde la parte superior de mi cabeza)

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

actualización a la respuesta de Krumelur (reemplace 2 primeras líneas de su/su solución con esto):

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

Sí, entonces escupirá todos los subárboles si hay varias raíces. Pero realmente: un árbol con varios nodos es muy raro en la naturaleza :-) Oh, y es "suyo";) – Krumelur

+0

De hecho, en la naturaleza esto es un phaenommena bastante común :) En la programación puedo imaginar algunos escenarios donde es útil. Por ejemplo: treeview que contiene los departamentos de una empresa, cada uno con subdepartamentos y así sucesivamente. Probablemente no tengas ningún superdepartamento. – dzendras

+0

Tienes razón. Ajusté mi respuesta. Fue un error tipográfico – Krumelur

6

enfoque perezoso LINQ, en caso de que Está buscando algo como esto:

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

Puede utilizar dos métodos de extensión recursiva. Usted puede llamar myTreeView.GetAllNodes() o 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

Debido TreeView tiene muchos niveles, hacer la función recursiva:

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

de llamar esta función para todos los primeros nodos de nivel en TreeView:

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

El código es del sitio C# TreeView

1

Si usted d no es necesario que la clave del nodo sea única, simplemente configure todas las claves del nodo en una cadena vacía (""), luego puede hacer un Treeview1.Nodes.Find("", true); para devolver todos los nodos dentro de una TreeView.

Cuestiones relacionadas