Test existance Node dans 1 TreeView

Résolu
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013 - 9 sept. 2004 à 03:12
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 - 9 sept. 2004 à 20:10
Pour tester la présence d'un Node dans 1 TreeView, je fais le code suivant :

If TreeExtr.Nodes(strPath) Is Nothing Then
msgbox "Ce Node N'existe pas encore"
..... suite ....
Else 'le node existe
.......suite .....
End If

Lorsque le Node existe VB passe correctement dans la boucle Else ...., mais s'il n'existe pas, le résultat du test devrait être à Nothing en entraîner la msgbox, au lieu de ça je récupère 1 erreur 35601 !

Qq'un a-t-il 1 idée sur le problème ?
D'avance Merci.

9 réponses

crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
9 sept. 2004 à 08:57
Normal !!! Il faut passer par un gestionnaire d'erreur car si le node n'existe pas, au moment ou il évalue l'expression suivante : "TreeExtr.Nodes(strPath)", VB se plante !!!
Function NodeExist(strPath as String) As Boolean
Dim Buffer as String
NodeExist = True
On Error Goto NoNode
Buffer = TreeExtr.Nodes(strPath).Text
Exit Function
NoNode:
NodeExist = False  ' Ligne inutile ! Mais clarifie le code !
End Function


Christophe R.
3
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
9 sept. 2004 à 15:45
en fait le treeview fonctionne plus ou moins comme une collection... Et pour une collection le seul moyen (que je connaisse) de savoir si un élément existe ou pas c'est de tester avec une gestion d'erreur ...Donc cela me semble étrange que tu puisses faire un Is Nothing...

Toutefois , puiske tu cherches à avoir des infos...
Voici un cas où Is Nothing peut servir dans un Treeview:
Voici un treeview, je n'ai pas de FullRowSelect= True toutefois je cherche à faire en sorte que si mon utilisateur click sur une ligne, la ligne se sélectionne...

Pour cela rien de plus simple :

Private Sub TreeView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
    Dim NodeClick As Object
    
'on test à la position 0
'attention il faut rajouter la largeur d'un + ou d'une icone au besoin, mais ce n'est pas ce qui nous intéresse là...
    Set NodeClick = TreeView1.HitTest(0, y)
    
'et je vérifie si l'objet est bien existant .....Notes alors que je ne fait pas du tout référence a la collection Nodes du treeview . Là , je récupère l'objet placé à la position 0,y
    If NodeClick Is Nothing Then Exit Sub

'Or mon control est un treeview donc l'obejt en question est une Node ;-)
'Donc je fait :
    NodeClick.Selected = True
End Sub


Voilà j'espère que cela t'auras un peu aidé sur l'utilisation du Is Nothing sur un Treeview

@+

Yomm >:)

[mailto:yommvb@ifrance.com yommvb@ifrance.com]

Et que la source soit avec toi!!!!!
3
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
9 sept. 2004 à 19:28
Salut Yannick, à part utiliser la routine d'erreur, ce qui me semble le plus simple, il te reste la possibilité de faire ta propre fonction. voici ce que j'ai trouvé sur le net:

Récupérer un noeud avec sa clé : Problème !

Si vous avec un peu l'habitude de travailler avec le contrôle ListView, vous savez qu'il est très simple de récupérer un ListItem en donnant sa clé :

Set wItem = LV_Essai.ListItems("LaClé")

Avec le contrôle TreeView ça ne marche pas ! On ne peut récupérer un Node qu'en donnant son index car le paramètre attendu est converti en Long par le contrôle :

Set wNode = Tv1.Nodes(3)

Pourtant le fait de pouvoir récupérer un noeud par sa clé me semble un minimum. Il faut juste se créer une petite fonction qui prend comme paramètres le TreeView concerné et la clé à retrouver et qui retourne le Node trouvé ou Nothing si la clé ne correspond à aucun noeud :

Public Function RetournerNoeud(ByVal wTV As TreeViewCtl, ByVal wKey As String) As Node
Dim i As Integer
Set RetournerNoeud = Nothing
For i = 1 To wTV.Nodes.Count
If wTV.Nodes(i).Key = wKey Then
Set RetournerNoeud = wTV.Nodes(i)
Exit For
End If
Next
End Function
3
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
9 sept. 2004 à 19:56
>>Gobillot
Le but recherché par yan35 n'était pas de trouver une node par sa clé mais de pouvoir savoir si une node avec une clé X existe ou pas sans avoir a toute les tester

Le code proposé par crenaud76 serait donc plus rapide...Et en le modifiant quelque peu on obtien le même résultat que toi...

Function GetNode(strPath as String) As Node

On Error Goto NoNode
set GetNode = TreeExtr.Nodes(strPath)
Exit Function
NoNode:
set GetNode = Nothing
End Function


Yomm >:)

[mailto:yommvb@ifrance.com yommvb@ifrance.com]

Et que la source soit avec toi!!!!!
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
9 sept. 2004 à 11:21
Bonjour,
Je te remercie de ta réponse, mais quelque chose m'échappe toujours.
En effet, j'ai vu dans de la doc sur le net que pour tester l'existance d1 node on pouvait vérifier le retour du test à Nothing en écrivant : TV.Nodes(sa référence) Is Nothing.

C'est juste pour en savoir + et éventuellement éviter 1 test supplémentaire que je m'accroche à comprendre la condition Is Nothing, sinon ton gestionnaire d'erreur me convient parfaitement.

Merci
yannick
0
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
9 sept. 2004 à 16:26
Merci pour tes explications sur l'utilisation de Is Nothing.
Pour mon problème j'utiliserai 1 gestion d'erreur.
Pour info voici le lien où j'ai trouvé le test de l'existence d'1 noeud par Is Nothing :
http://vb.developpez.com/faq/?page=Controles#noeud_existe

?? ;)
0
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
9 sept. 2004 à 19:58
Bonsoir Daniel,

Ca c'est beau comme fonction. MERCI.
Reste à savoir, si par contre, il n'est pas + rapide et moins consommateur de ressources de passer par 1 gestionnaire d'erreurs s'il y a de nombreux tests à faire (ce qui est mon cas) ?
Yannick :)
0
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
9 sept. 2004 à 20:05
Gros Merci,

Ton code fait la synthèse de tout et apporte la réponse au doute que j'avais sur la rapidité de la fonction proposée par Gobillot.

yannick :)
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
9 sept. 2004 à 20:10
Je sais. en fait il faut bien tester toutes les clés pour savoir si elle existe ou pas. Je pense que c'est ce que doit faire le système mais il doit certainement le faire plus vite...
Cette fonction n'est pas de moi, mais c'était pour montrer qu'il existait une autre possibilité.

Daniel
0
Rejoignez-nous