11
votes

Obtenez une liste de tous les nœuds d'arbres (à tous les niveaux) dans les contrôles TreeView

Comment puis-je obtenir une liste de tous les nœuds d'arbres (à tous les niveaux) dans un TreeView Control?


0 commentaires

9 Réponses :


20
votes

En supposant que vous avez un arbre avec un nœud racine, le code suivant bouclera toujours les nœuds d'arbre jusqu'au plus profond, puis sur un niveau de niveau et ainsi de suite. Il imprimera le texte de chaque nœud. (Non testé du sommet de ma tête) xxx


0 commentaires

6
votes

mise à jour de la réponse de Krumelur (remplacez 2 premières lignes de sa solution avec ceci): XXX


4 commentaires

Ouais, alors il crachera tous les sous-arbres s'il y a plusieurs racines. Mais vraiment: un arbre avec plusieurs nœuds est une nature vraiment rarement dans la nature :-) Oh, et c'est "son";)


En fait, dans la nature, c'est un phaenommena assez commun :) dans la programmation, je peux imaginer quelques scénarios où il est utile. Par exemple: TreeView contenant des départements d'une entreprise, chacun ayant des sous-chevrins, etc. Vous n'aurez probablement aucun superdéparateur.


Désolé les gars, mais vous avez tous les deux besoin de modifier vos réponses. @Krumelur Votre foreach est mal orthographié et Dzendraas, votre «Var» n'est pas correct. Ne devrait-il pas être un casting de somesort à Treenode? En c # var n'est pas reconnu.


Bien qu'il soit vrai que VAR est reconnu par le nouveau compilateur C #, il doit connaître le type à fonctionner correctement et les nœuds sont iénumérables, pas iénumérables et seront donc saisis comme objet.



9
votes

Approche de Linq paresseux, juste au cas où vous recherchez quelque chose comme ceci: xxx


0 commentaires

24
votes

Vous pouvez utiliser deux méthodes d'extension récursives. Vous pouvez soit appeler mytreeview.getallnodes () ou mytreNode.getallNodes () : xxx


2 commentaires

Eure pour moi changer _self.childnodes par _self.nodes . N'oubliez pas d'écrire ces deux méthodes dans une nouvelle classe statique: Public Static Class TreeviewExtensions .


@daniherera merci, j'ai réparé l'erreur. Je ne sais pas pourquoi j'ai utilisé enfants en premier lieu.



0
votes

Parce que TreeView a de nombreux niveaux, effectue une fonction récursive: xxx pré>

que d'appeler cette fonction pour tous les nœuds de premier niveau dans TreeView: P>

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


0 commentaires

1
votes

Si vous n'avez pas besoin de la touche nœud pour être unique, définissez simplement toutes les touches de nœuds sur une chaîne vide ( "" ), alors vous pouvez faire un arboresview1.nodes .Find ("", vrai); pour renvoyer tous les nœuds dans un arborescence.


0 commentaires

0
votes

Ce code vous aidez à itération via toute la liste des arbres avec l'identification du niveau de profondeur actuel. Le code peut être utilisé pour enregistrer des éléments d'arborescence au fichier XML et à d'autres fins. xxx


0 commentaires

1
votes

Je pense que ma solution est plus élégante, il utilise des génériques (car TreeView peut stocker chaque type d'objets dérivé de Treenode) et possède une seule fonction appelée récursivement. Il devrait être simple aussi convertir cela comme une extension. XXX PRE>

L'utilisation est simple, appelez simplement: p>

    List<MyNodeType> allnodes = EnumerateAllTreeNodes<MyNodeType>(tree);


0 commentaires

1
votes

Si vous avez besoin d'un peu de traitement dans tous les nœuds d'une arborescence, vous pouvez utiliser une pile plutôt que des méthodes récursives:

Stack<TreeNode> nodeStack = new Stack<TreeNode>(treeview1.Nodes.Cast<TreeNode>());
while(nodeStack.Count > 0)
{
   TreeNode node = nodeStack.Pop();

   // Do your processing on the node here...

   // Add all children to the stack
   if(node.Nodes.Count > 0)
     foreach(TreeNode child in node.Nodes)
        nodeStack.Push(child);
}
   


0 commentaires