Comment puis-je obtenir une liste de tous les nœuds d'arbres (à tous les niveaux) dans un TreeView code> Control? P>
9 Réponses :
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)
mise à jour de la réponse de Krumelur (remplacez 2 premières lignes de sa solution avec ceci):
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
Approche de Linq paresseux, juste au cas où vous recherchez quelque chose comme ceci:
Vous pouvez utiliser deux méthodes d'extension récursives. Vous pouvez soit appeler mytreeview.getallnodes () code> ou
mytreNode.getallNodes () code>:
Eure pour moi changer _self.childnodes code> par
_self.nodes code>. N'oubliez pas d'écrire ces deux méthodes dans une nouvelle classe statique:
Public Static Class TreeviewExtensions Code>.
@daniherera merci, j'ai réparé l'erreur. Je ne sais pas pourquoi j'ai utilisé enfants code> en premier lieu.
Parce que TreeView a de nombreux niveaux, effectue une fonction récursive: 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);
}
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 ( "" code>), alors vous pouvez faire un
arboresview1.nodes .Find ("", vrai); code> pour renvoyer tous les nœuds dans un arborescence. P>
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.
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. L'utilisation est simple, appelez simplement: p> List<MyNodeType> allnodes = EnumerateAllTreeNodes<MyNodeType>(tree);
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); }