VB.NET – Ajouter des noeuds dans un TreeView … et les retrouver

Problématique

Même si on visualise bien en quoi ça consiste, il n’est pas toujours facile de manipuler les TreeView. La logique est tellement évidente qu’on se prend facilement les pieds dans le tapis. Mais quand on y est, quel bonheur !

Solution

Ajouter un noeud dans un TreeView

Tout d’abord, quand vous construisez un TreeView (on l’appellera par la suite mùyTreeView), il commence à vide. Il dispose d’une collection Nodes vide. Il faut donc créer le noeud « racine ».

Avec ce noeud-racine, nous apprendrons comment créer un noeud quelconque. Il y a plusieurs syntaxes incluant en particulier celles qui permettent d’assigner une icône au noeud. Mais je n’ai pas encore utilisé cette fonctionnalité, je ne vous en parlerai pas puisque que je ne parle que de ce que j’ai pu faire. Les deux possibilités principales sont :

  • myTreeView.Nodes.Add(text)
  • myTreeView.Nodes.add(key, text)

key et text sont deux paramètres, au format « string » bien entendu, plutôt fondamentaux :

  • key est comme son nom l’indique, le nom du noeud et surtout le moyen d’y accéder
  • text est le texte qui s’affichera sur le noeud. Il est donc tout aussi important. Il n’en est pas moins facultatif puisque vous pouvez parfaitement souhaiter ne pas afficher de texte à un noeud d’un arbre.

Mais étrangement, VB.NET vous propose d’abord de créer un noeud par son texte. Bon …

Par exemple, key pourra être le n° client et text son nom. Classique …

Ces deux données peuvent être lues et mises à jour par les instructions :

  • key :  node.Name = « key »
  • text : node.Text = »text »

ATTENTION DANGER !

key est une string, mais votre clef peut être numérique donc :

à la création du noeud, vous pouvez tout à fait passer la veleur de la clef en numérique, VB convertira automatiquement en string

Mais à la lecture (voir plus loin), il faudra chercher cette clef au format string en la convertissant en string par CStr(key) sinon il cherchera un index.

Imaginez que vous cherchez un n° de Sécu, en mode texte il trouvera sans problème si vous oubliez la conversion (le cast), il cherchera un index de rang 10000 milliards. je ne doute pas que vous gériez des projets titanesques mais à ce point ! Vous risquez plutôt de recevoir de VB un message d’insultes et ce sera bien fait car je vous aurais prévenus.

Mais vous me direz, et vous aurez raison : « c’est quoi node ? ». C’est la variable TreeNode qui contient le noeud. « Ah bon ? et comment la retrouve-je ? » direz-vous car vous êtes pleins de bon sens ? C’est l’objet du paragraphe suivant.

Comment retrouver un noeud dans l’arbre ?

Les deux manières principales sont habituelles en Visual Basic :

  • par l’index du noeud
  • par la key du noeud

Par l’index

L’index est le n° d’ordre du noeud « fils » dans la collection des sous-noeuds du noeud « père ». Ce numéro est généré automatiquement. On peut l’utiliser pour lister les noeuds « fils » mais pour retrouver le noeud, ce n’est pas l’idéal. Par exemple, on peut procéder de la manière suivante :

dim node as TreeNode

for i=1 to Nodes.Count

if Nodes(i). Text = [votre condition] (ou Nodes(i).Name = [votre condition si votre test est sur la clef du noeud]) then

node=Nodes(i)

exit for

endif

next

mais « c’est quoi Nodes me direz-vous ? » car décidément vous ne posez que des questions intelligentes. Et je vous répondrai ensuite car il faut y aller par étapes.

Par la clef

Là c’est beaucoup plus simple pour retrouver le noeud visé, il suffit d’écrire :

node=Nodes(key)

vous comprendrez pourquoi je préfère cette méthode.

La collection Nodes

Nous avons cherché dans la collection Nodes. Mais qu’est-elle ? (à prononcer doucement car « mékétel » ne veut rien dire).

Ne tombez pas dans le panneau dans lequel je suis tombé. La collection Nodes est celle des sous-noeuds d’un noeud donné et non celle des noeuds du TreeView.  Dans un  TreeView, vous pourrez donc avoir des noeuds qui ont la même clef à condition qu’il ne soient pas au même niveau dans la même branche : à monn avis, ce n’est pas sain.

Pour être plus clair, même si vous avez une key unique dans le TreeView, vous ne la trouverez par

myTreeView.Nodes(key)

que si elle est au premier niveau de l’arborescence.

Ce qui signifie que pour retrouver une clef dans un arbre complet, il vous faut écrire une recherche récursive. Vous savez sans doute le faire, sinon un peu de patience, j’en parlerai bien un jour.

ET LE TOUR EST JOUÉ ! ALORS ON DIT MERCI QUI ?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *