2010-12-01 34 views
4

Comment insérer un nouvel enfant dans un nœud particulier dans un TreeView dans C# WinForms?C# - TreeView: insertion d'un nœud à une certaine position

J'ai poignarder maladroitement à TreeViews pendant près d'une heure et je voudrais utiliser TreeView de C# comme ceci:

treeView.getChildByName("bob").AddChild(new Node("bob's dog")); 

Voici ce que j'ai essayé dernier (qui je pense est à un niveau de pilosité C# ne devrait jamais m'avoir permis d'atteindre):

tree.Nodes[item.name].Nodes.Add(new TreeNode("thing")); 

Inutile de dire que cela ne fonctionne pas.

Oh, et voici une question paresseuse: pouvez-vous réellement stocker des objets dans ces nœuds? Ou TreeNode ne supporte que les chaînes et autres? (dans ce cas, je devrais étendre TreeNode ../sigh)

S'il vous plaît, aidez, merci!

+0

Si vous êtes libre de choisir, jetez un oeil à WPF. Vous pouvez modéliser vos données comme vous le souhaitez et les lier à TreeView. – VVS

+0

Oh, mec, je passerais à WPF dans un battement de coeur si je devais avoir l'option .. Pour commencer, rien avec l'aide de XML est un pas en avant. – Spectraljump

Répondre

6

En fait, votre code devrait fonctionner - afin d'ajouter un sous-nœud il vous suffit de faire:

myNode.Nodes.Add(new TreeNode("Sub node")); 

Peut-être que le problème est dans la façon dont vous faites référence à vos noeuds existants. Je devine que tree.Nodes [item.Name] retourné null?

Pour que cet indexeur trouve le nœud, vous devez spécifier une clé lorsque vous ajoutez le nœud. Avez-vous spécifié le nom du noeud en tant que clé? Par exemple, le code suivant fonctionne pour moi:

treeView1.Nodes.Add("key", "root"); 
treeView1.Nodes["key"].Nodes.Add(new TreeNode("Sub node")); 

Si ma réponse ne fonctionne pas, pouvez-vous ajouter plus de détails sur ce qui arrive? Avez-vous eu une exception ou simplement rien ne s'est-il passé? PS: afin de stocker un objet dans un nœud, au lieu d'utiliser la propriété Tag, vous pouvez également dériver votre propre classe à partir de TreeNode et y stocker n'importe quoi. Si vous développez une bibliothèque, cela est plus utile car vous laissez la propriété Tag à vos utilisateurs.

Ran

+0

Merci, monsieur! 'tree.Nodes [item.Name]' renvoyait null (bien qu'il m 'ait fallu du temps pour le comprendre). Je ne savais pas comment définir une clé d'index comme vous l'avez montré. C'était mon problème (j'avais aussi un problème "sans rapport" qui me troublait davantage) mais je ne pouvais pas aller chercher le nœud où je voulais insérer. Merci encore. – Spectraljump

2

Eh bien, pour commencer, oui, vous pouvez stocker des objets dans chaque nœud. Chaque noeud a une propriété Tag de type object.

Ajouter des nœuds devrait être assez simple. Selon MSDN:

// Adds new node as a child node of the currently selected node. 
TreeNode newNode = new TreeNode("Text for new node"); 
treeView1.SelectedNode.Nodes.Add(newNode); 
+0

ouf!Merci pour le conseil. – Spectraljump

+0

En ce qui concerne votre édition, je ne vais pas avoir un "SelectedNode" à ajouter. Donc cette méthode (dont je lis btw) n'aide pas .. – Spectraljump

+0

Ah ... on dirait que Ran a quelques bons exemples et semble comme s'ils allaient fonctionner - pas besoin de ressasser ce qu'il a. :) – IAbstract

3

Vous pouvez utiliser Insérer au lieu de Ajouter.

tree.Nodes[item.name].Nodes.Insert(2, (new TreeNode("thing"))); 
0

Sinon, si Davita ce n'est pas la réponse parfaite, vous devez conserver une référence aux noeuds, donc si vous aviez une référence à Bob, vous pouvez ajouter le chien de bob

TreeNode bob = new TreeNode ("bob"); treeView1.Nodes.Add (bob); bob.Nodes.Add (nouveau TreeNode ("Dog"));

+0

Il est vrai que j'ai besoin d'une sorte de référence. Mais je ne peux pas faire ce que vous avez écrit puisque je ne vais pas ajouter de nœuds dans la même fonction que celle que j'insère. Quoi qu'il en soit, Ran a résolu mon problème et m'a éclairé: je n'avais pas de «clé», et je ne savais pas comment en définir un. – Spectraljump