Pointer tous les fils, sous-fils ... d'1 Node

Résolu
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013 - 3 sept. 2004 à 14:51
smerlo Messages postés 15 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 23 janvier 2008 - 7 sept. 2004 à 22:12
J'aimerais lorsque je click dans 1 check d'un node que tous les fils, sous-fils, sous-sous ....., enfin que toute la branche soit pointée, mais ça paraît + compliqué que je l'imaginais : en utilisant lastSibling ça ne suffit pas ! je fais :
For I = Node.index to Node.child.lastSibling.index
' mes opérations
Next

Mais ça ne pointe pas tout.

Merci de votre aide

14 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
3 sept. 2004 à 15:33
et si t'essayais çà:

For I = Node.Index To
Treeview1
.Nodes.Count
'mes opérations
Next
3
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
3 sept. 2004 à 15:51
D'abord, Merci de ta réponse.
Je vais essayer, mais je me demande si ça répond à mon besoin car je pense que ça pointera tous les Nodes du TV et non tous les Nodes et sous-Nodes ... du Node Checked (en d'1 branche).

Merci encore
3
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
3 sept. 2004 à 17:21
oui je sais. à toi de tester si c'est bien un enfant, et pour chaque enfant voir s'il y a des enfants, etc...
je pense qu'il faudra passer par la récursivité.
Daniel
3
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
3 sept. 2004 à 17:35
Merci de ta réponse.
Oui, il faut passer à la récursité, mais je patine !
Si tu as des suggestions Merci..
J'essaye 1 truc du style, mais je n'arrive pas à récupérer 1 node dans la procédure appelée :

            For I = Node.Index To Node.Child.LastSibling.Index 
                If Tree.Nodes(I).Checked = False Then
                    Tree.Nodes(I).Checked = True
                End If
                If Tree.Nodes(I).Children > 0 Then
                    CheckRecurs (Tree.Nodes(I).Child)
                End If
            Next

Public Sub CheckRecurs(NodEnfant As MSComctlLib.Node)

' pointage
End Sub

3

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

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
3 sept. 2004 à 17:53
Call Rchild(Node.Index, Node.Key)

Private Sub Rchild(Index As Long, Parent As String)
Dim i As Long
For i = Index + 1 To tree.Nodes.Count
If tree.Nodes(i).Parent.Key = Parent Then
tree.Nodes(i).Cheched = True
Call Rchild(tree.Nodes(i).Index, tree.Nodes(i).Key)
End If
Next
End Sub
3
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
3 sept. 2004 à 18:08
Merci bcp de ta réponse, je vais tester tout ça.
C'est sympa de me sortir de cette galère, les Nodes c'est pas mon truc !
3
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
3 sept. 2004 à 18:29
OK Je te laisse tester.
si ça marche tu valides la réponse sinon tu dis pourquoi.

@ PLUS
3
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
3 sept. 2004 à 20:43
Si on des enfants sans parents d'accord faut mettre le test sinon plantage. c'est pas le cas chez moi parce que je met tout en child, sauf le premier qui est parent, et comme je fais index+1 le premier n'est jamais pris.

Pour le test:
If Tree.Nodes(i).Checked = False Then
Tree.Nodes(i).Checked = True
End If
le mettre directement à True revient au même mais êvite un test.

Par contre tester la présence des enfants, c'est très bon, ça évite un tas de boucles inutiles.

Dans ton code, pour que la boucle For se fasse il faut inverser les index ou mettre step-1 (moins pratique).

Bonne Prog. Daniel
3
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
3 sept. 2004 à 18:49
Merci ça marche, je valide toutes les réponses.
Pour info, mon code, sur lequel je bogguais marche aussi, j'avais oublié le call dans l'appel de ma proc et à chaque fois que je passais le node en argument j'obtenais 1 message d'erreur. Ta procédure n'y a fait penser ....
En tout cas MERCI de ton aide.
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
3 sept. 2004 à 18:55
ok merci
tu as 2 façons d'appeler une procédure
avec parenthèses:
Call CheckRecurs (Tree.Nodes(I).Child)
sans parenthèses:
CheckRecurs Tree.Nodes(I).Child
0
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
3 sept. 2004 à 20:17
Après d'autres tests, j'ai dû ajouter des compléments à ta procédure.
Les voici :

Private Sub Rchild(Index As Long, Parent As String)
' procédure de pointage Récursive
Dim i As Long
For i = Index + 1 To Tree.Nodes.Count
    If Not Tree.Nodes(i).Parent Is Nothing Then 
'comme on pointe ts les nodes qui suivent, évite err avec nodes sans parents
        If Tree.Nodes(i).Parent.Key = Parent Then
            If Tree.Nodes(i).Checked = False Then
                Tree.Nodes(i).Checked = True
            End If
            If Tree.Nodes(i).Children > 0 Then  
            ' ne lance la récursité que s'il y a des enfants
                Call Rchild(Tree.Nodes(i).Index, Tree.Nodes(i).Key)
            End If
        End If
    End If
Next
End Sub



Je crois que c'est correct et utile si d'autres s'en servent.
Par Ailleurs, ma proc qui marche est moins bonne que la tienne car si on check 1 autre node ajouté séquentiellement après dans la TV triée en ordre croissant se servir des index pour délimiter la boucle For peut conduire à un index fin < que le début, alors qu'en pointant tous les nodes après celui sélectionné ne crée pas ce prblème .....

Merci bcp de ton aide.
0
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
4 sept. 2004 à 01:40
Bonsoir Daniel,

Effectivement mon test

If Tree.Nodes(i).Checked = False Then
Tree.Nodes(i).Checked = True
End If

est complétement inutile.

Merci encore
yannick
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
4 sept. 2004 à 02:20
Essayer de répondre aux questions, ça permet d'apprendre un tas de choses. Il y a pas longtemps que je fais du VB et j'ai encore beaucoup à apprendre.

Celui qui sait qu'il ne sait pas, éduque le. Celui qui sait qu'il sait, écoute le. Celui qui ne sait pas qu'il sait, éveille le. Celui qui ne sait pas qu'il ne sait pas, fuis le.

Bonne nuit Yannick.
0
smerlo Messages postés 15 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 23 janvier 2008
7 sept. 2004 à 22:12
Vous m'enlevez une sacrée épine du pied avec ce post, je voyais bien qu'il fallait investiguer du côté de la reccursivité mais ça me faisait peur.
Un grand merci à tous les 2.
0
Rejoignez-nous