Bonjour,
Je voudrais savoir s'il existe un moyen pour savoir si tous les noeuds frères sont cochés ou s'ils sont tous décochés afin de cocher ou décocher le noeud parent.
Merci
Ludo
Bonjour,
Je voudrais savoir s'il existe un moyen pour savoir si tous les noeuds frères sont cochés ou s'ils sont tous décochés afin de cocher ou décocher le noeud parent.
Merci
Ludo
Tu voudrais savoir en fait si quand tu coches un noeud parent les objets enfants sont cochés (comme dans les installers d'application par exemple) ou à l'inverse ?
Les 2 en fait. Tu as eu raison de poser cette question ça complète la mienne.
Voilà j'ai tester et j'ai fais ça:
1- Un TreeView avec comme propriétés d'activées
2- Cette méthode de créer "AfterCheck"
- CheckBoxes = True
- FullRowSelect = True
Voilà j'ai testé et cela me paraît satisfaisant. Le seul souci est que si tu va trop vite dans le cochage / décochage il se peut que le noeud parent ne fasse pas l'effet souhaité. Je n'ai pas encore trouvé la solution, j'ai essayé en désactivant le treeview mais ça n'a pas l'air de fonctionner.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck 'On désactive temporairement le TreeView CType(sender, TreeView).Enabled = False 'On enlève l'évènement du checked pour éviter la boucle infinie RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck 'Si le Noeud coché n'a pas de Noeud Parent .... If e.Node.Parent Is Nothing Then 'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché) For Each _Noeud As TreeNode In e.Node.Nodes _Noeud.Checked = e.Node.Checked Next 'Sinon .... Else 'On compte le nombre de noeuds cochées Dim NoeudsCoches As Integer = 0 For Each _Noeud As TreeNode In e.Node.Parent.Nodes If _Noeud.Checked Then NoeudsCoches += 1 End If Next 'Si le nombre de noeuds cochés correspond au nombres de noeuds enfants du parent alors ... If NoeudsCoches = e.Node.Parent.Nodes.Count Then 'On coche le noeud parent e.Node.Parent.Checked = True 'Sinon si le nombre est inférieur au nombre de noeuds enfants du parent alors ... ElseIf NoeudsCoches < e.Node.Parent.Nodes.Count Then 'On décoche le noeud parent e.Node.Parent.Checked = False End If End If 'On remet l'évènement du checked sur le TreeView AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck 'On réactive le TreeView CType(sender, TreeView).Enabled = True End Sub
Voilà si tu trouves fais le savoir ça pourrait me servir un jour
Bon développement
Merci beaucoup D4rkTiger !
Par contre j'ai un nouveau problème car j'ai essayé d'adapter ton code de manière récursive mais je bloque sur l'appel récursif. Si tu as une solution, n'hésite pas...
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck 'On désactive temporairement le TreeView CType(sender, TreeView).Enabled = False 'On enlève l'évènement du checked pour éviter la boucle infinie RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck CocheDecocheNoeud(e) 'On remet l'évènement du checked sur le TreeView AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck 'On réactive le TreeView CType(sender, TreeView).Enabled = True End Sub Public Sub CocheDecocheNoeud(ByVal e As System.Windows.Forms.TreeViewEventArgs) 'Si le Noeud coché n'a pas de Noeud Parent .... 'If e.Node.Parent Is Nothing Then 'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché) For Each _Noeud As TreeNode In e.Node.Nodes _Noeud.Checked = e.Node.Checked Next 'Sinon .... 'Else If Not (e.Node.Parent Is Nothing) Then 'On compte le nombre de noeuds cochées Dim NoeudsCoches As Integer = 0 For Each _Noeud As TreeNode In e.Node.Parent.Nodes If _Noeud.Checked Then NoeudsCoches += 1 End If Next 'Si le nombre de noeuds cochés correspond au nombres de noeuds enfants du parent alors ... If NoeudsCoches = e.Node.Parent.Nodes.Count Then 'On coche le noeud parent e.Node.Parent.Checked = True 'Sinon si le nombre est inférieur au nombre de noeuds enfants du parent alors ... ElseIf NoeudsCoches < e.Node.Parent.Nodes.Count Then 'On décoche le noeud parent e.Node.Parent.Checked = False End If End If CocheDecocheNoeud(e.Node.Parent.Nodes) <== c'est là que je bloque :( End Sub
Je ne comprends pas pourquoi tu fais cet appel récursif à la fin de ta procédure (tu crées une boucle infine à faire ça ?)
C'est ce que tu cherches ou bien tu cherches autre chose ?
en fait avec ton code ça ne fonctionne que pour le noeud racine et ses enfants mais pas pour les enfants des enfants...etc...
C'est pour ça que j'ai voulu en faire une fonction récursive. Et justement je ne sais pas comment appeler un noeud enfant dans le paramètre de ma fonction récursive.
Ok je vois mieux le principe. Peux - tu peux me dire le nombre d' "etages" que tu souhaites dans tes noeuds principaux ?
En fait y'a 3 niveaux : la racine, ses enfants, et les enfants des enfants.
Voici à quoi ça devrait ressembler.
Ok maintenant c'est plus clair
Donc voilà comment tu peux faire dans l'immédiat (je vais réfléchir à un système généraliste == système n'ayant pas de nombre définis de niveaux)
Note: J'ai repris ton code
Essaye de cette manière (j'ai peut être finalement trouvé la façon itérative en tapant la correction)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck 'On désactive temporairement le TreeView CType(sender, TreeView).Enabled = False 'On enlève l'évènement du checked pour éviter la boucle infinie RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck CocheDecocheNoeud(e) 'On remet l'évènement du checked sur le TreeView AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck 'On réactive le TreeView CType(sender, TreeView).Enabled = True End Sub Public Sub CocheDecocheNoeud(ByVal e As System.Windows.Forms.TreeViewEventArgs) 'Si le Noeud coché n'a pas de Noeud Parent .... If e.Node.Parent Is Nothing Then 'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché) For Each _Noeud As TreeNode In e.Node.Nodes _Noeud.Checked = e.Node.Checked Next 'Sinon si le noeud a des enfants cocher les enfants ElseIf e.Node.Nodes.Count > 0 Then 'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché) For Each _Noeud As TreeNode In e.Node.Nodes _Noeud.Checked = e.Node.Checked Next 'Sinon... Else 'On compte le nombre de noeuds cochées Dim NoeudsCoches As Integer = 0 For Each _Noeud As TreeNode In e.Node.Parent.Nodes If _Noeud.Checked Then NoeudsCoches += 1 End If Next 'Si le nombre de noeuds cochés correspond au nombres de noeuds enfants du parent alors ... If NoeudsCoches = e.Node.Parent.Nodes.Count Then 'On coche le noeud parent e.Node.Parent.Checked = True 'Sinon si le nombre est inférieur au nombre de noeuds enfants du parent alors ... ElseIf NoeudsCoches < e.Node.Parent.Nodes.Count Then 'On décoche le noeud parent e.Node.Parent.Checked = False End If End If End Sub
ARf ! Désolé de te dire ça mais ça ne fonctionne toujours pas. Car si je coche "Genre" seul ses enfants se cochent et pas les enfants de ses enfants. Et pareil si je coche ou décoche tous les enfants des enfants, ça n'a aucune incidence sur la racine.
Ah pardon j'avais oublié ce détails
Je la refait
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck 'On désactive temporairement le TreeView CType(sender, TreeView).Enabled = False 'On enlève l'évènement du checked pour éviter la boucle infinie RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck CocheDecocheNoeud(e) 'On remet l'évènement du checked sur le TreeView AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck 'On réactive le TreeView CType(sender, TreeView).Enabled = True End Sub Public Sub CocheDecocheNoeud(ByVal e As System.Windows.Forms.TreeViewEventArgs) 'Si le Noeud coché n'a pas de Noeud Parent .... If e.Node.Parent Is Nothing Then 'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché) For Each _Noeud As TreeNode In e.Node.Nodes _Noeud.Checked = e.Node.Checked 'Si ce noeud à des noeuds enfants, les mettre dans le même état que le premier If _Noeud.Nodes.Count > 0 For Each _NoeudEnfant As TreeNode In _Noeud.Nodes _NoeudEnfant.Checked = e.Node.Checked Next End If Next 'Sinon si le noeud a des enfants cocher les enfants ElseIf e.Node.Nodes.Count > 0 Then 'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché) For Each _Noeud As TreeNode In e.Node.Nodes _Noeud.Checked = e.Node.Checked Next 'Sinon... Else 'On compte le nombre de noeuds cochées Dim NoeudsCoches As Integer = 0 For Each _Noeud As TreeNode In e.Node.Parent.Nodes If _Noeud.Checked Then NoeudsCoches += 1 End If Next 'Si le nombre de noeuds cochés correspond au nombres de noeuds enfants du parent alors ... If NoeudsCoches = e.Node.Parent.Nodes.Count Then 'On coche le noeud parent e.Node.Parent.Checked = True 'Sinon si le nombre est inférieur au nombre de noeuds enfants du parent alors ... ElseIf NoeudsCoches < e.Node.Parent.Nodes.Count Then 'On décoche le noeud parent e.Node.Parent.Checked = False End If End If End Sub
Je le fais bosser, de nuit en plus , et il s'excuse C'est le monde à l'envers.
En tout cas tu y es presque, le fait de cocher ou décocher la racine coche ou décoche bien tout le reste mais si on décoche un enfant ou un enfant d'un enfant ça ne décoche pas la racine. Et si je coche tous les enfants ou tous les enfants des enfants ça ne coche pas la racine. Voilà tu sais tout
J'ai testé mon code et chez moi cela fonctionne correctement ?
Peux tu me dire ce qui ne va pas exactement ?
Pardon excuse moi j'avais pas vu la première cas e à cocher qui en effet reste cochée.
(je up la solution)
Si je coche tous les enfants (ou les enfants des enfants) ça coche pas la racine "Genre". Idem lorsqu'on décoche.
Voilà normalement ce code là doit fonctionner
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84 Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck 'On désactive temporairement le TreeView CType(sender, TreeView).Enabled = False 'On enlève l'évènement du checked pour éviter la boucle infinie RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck CocheDecocheNoeud(e) 'On remet l'évènement du checked sur le TreeView AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck 'On réactive le TreeView CType(sender, TreeView).Enabled = True End Sub Public Sub CocheDecocheNoeud(ByVal e As System.Windows.Forms.TreeViewEventArgs) 'Si le Noeud coché n'a pas de Noeud Parent .... If e.Node.Parent Is Nothing Then 'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché) For Each _Noeud As TreeNode In e.Node.Nodes _Noeud.Checked = e.Node.Checked 'Si ce noeud à des noeuds enfants, les mettre dans le même état que le premier If _Noeud.Nodes.Count > 0 Then For Each _NoeudEnfant As TreeNode In _Noeud.Nodes _NoeudEnfant.Checked = e.Node.Checked Next End If Next 'Sinon si le noeud a des enfants cocher les enfants ElseIf e.Node.Nodes.Count > 0 Then 'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché) For Each _Noeud As TreeNode In e.Node.Nodes _Noeud.Checked = e.Node.Checked Next 'Sinon... Else 'On compte le nombre de noeuds cochées Dim NoeudsCoches As Integer = 0 For Each _Noeud As TreeNode In e.Node.Parent.Nodes If _Noeud.Checked Then NoeudsCoches += 1 End If Next 'Si le nombre de noeuds cochés correspond au nombres de noeuds enfants du parent alors ... If NoeudsCoches = e.Node.Parent.Nodes.Count Then 'On coche le noeud parent e.Node.Parent.Checked = True If e.Node.Parent.Parent IsNot Nothing Then 'On compte le nombre de noeuds cochées dans le niveau racine NoeudsCoches = 0 For Each _Noeud As TreeNode In e.Node.Parent.Parent.Nodes If _Noeud.Checked Then NoeudsCoches += 1 End If Next If NoeudsCoches = e.Node.Parent.Parent.Nodes.Count Then 'On coche le noeud parent e.Node.Parent.Parent.Checked = True ElseIf NoeudsCoches < e.Node.Parent.Parent.Nodes.Count Then 'On décoche le noeud parent e.Node.Parent.Parent.Checked = False End If End If 'Sinon si le nombre est inférieur au nombre de noeuds enfants du parent alors ... ElseIf NoeudsCoches < e.Node.Parent.Nodes.Count Then 'On décoche le noeud parent e.Node.Parent.Checked = False If e.Node.Parent.Parent IsNot Nothing Then 'On compte le nombre de noeuds cochées dans le niveau racine NoeudsCoches = 0 For Each _Noeud As TreeNode In e.Node.Parent.Parent.Nodes If _Noeud.Checked Then NoeudsCoches += 1 End If Next If NoeudsCoches = e.Node.Parent.Parent.Nodes.Count Then 'On coche le noeud parent e.Node.Parent.Parent.Checked = True ElseIf NoeudsCoches < e.Node.Parent.Parent.Nodes.Count Then 'On décoche le noeud parent e.Node.Parent.Parent.Checked = False End If End If End If End If End Sub
Oups !
Tu vas rire enfin j'espère mais maintenant ça fonctionne en effet en ce qui concerne les enfants des enfants. Si j'en décoche un alors que tout est coché ça décoche bien la racine "Genre". Par contre si tout est coché et que je décoche un noeud enfant, du style "aventure", ça ne décoche pas la racine...
Pareil si je coche tous les enfants ca ne coche pas la racine.
T'inquiètes pas j'en rigoles J'adores les défis
Tiens voilà j'ai modifié le code :
Bon eh bien est ce que je peux te dire que cela est correct ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100 Private Sub TreeView1_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck 'On désactive temporairement le TreeView CType(sender, TreeView).Enabled = False 'On enlève l'évènement du checked pour éviter la boucle infinie RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck CocheDecocheNoeud(e) 'On remet l'évènement du checked sur le TreeView AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck 'On réactive le TreeView CType(sender, TreeView).Enabled = True End Sub Public Sub CocheDecocheNoeud(ByVal e As System.Windows.Forms.TreeViewEventArgs) 'Si le Noeud coché n'a pas de Noeud Parent .... If e.Node.Parent Is Nothing Then 'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché) For Each _Noeud As TreeNode In e.Node.Nodes _Noeud.Checked = e.Node.Checked 'Si ce noeud à des noeuds enfants, les mettre dans le même état que le premier If _Noeud.Nodes.Count > 0 Then For Each _NoeudEnfant As TreeNode In _Noeud.Nodes _NoeudEnfant.Checked = e.Node.Checked Next End If Next 'Sinon si le noeud a des enfants cocher les enfants ElseIf e.Node.Nodes.Count > 0 Then 'Mettre tous ses noeuds enfants dans le même état que lui (coché ou décoché) For Each _Noeud As TreeNode In e.Node.Nodes _Noeud.Checked = e.Node.Checked Next 'On compte le nombre de noeuds cochées Dim NoeudsCoches As Integer = 0 For Each _Noeud As TreeNode In e.Node.Parent.Nodes If _Noeud.Checked Then NoeudsCoches += 1 End If Next 'Si le nombre de noeuds cochés correspond au nombres de noeuds enfants du parent alors ... If NoeudsCoches = e.Node.Parent.Nodes.Count Then 'On coche le noeud parent e.Node.Parent.Checked = True 'Sinon si le nombre est inférieur au nombre de noeuds enfants du parent alors ... ElseIf NoeudsCoches < e.Node.Parent.Nodes.Count Then 'On décoche le noeud parent e.Node.Parent.Checked = False End If 'Sinon... Else 'On compte le nombre de noeuds cochées Dim NoeudsCoches As Integer = 0 For Each _Noeud As TreeNode In e.Node.Parent.Nodes If _Noeud.Checked Then NoeudsCoches += 1 End If Next 'Si le nombre de noeuds cochés correspond au nombres de noeuds enfants du parent alors ... If NoeudsCoches = e.Node.Parent.Nodes.Count Then 'On coche le noeud parent e.Node.Parent.Checked = True If e.Node.Parent.Parent IsNot Nothing Then 'On compte le nombre de noeuds cochées dans le niveau racine NoeudsCoches = 0 For Each _Noeud As TreeNode In e.Node.Parent.Parent.Nodes If _Noeud.Checked Then NoeudsCoches += 1 End If Next If NoeudsCoches = e.Node.Parent.Parent.Nodes.Count Then 'On coche le noeud parent e.Node.Parent.Parent.Checked = True ElseIf NoeudsCoches < e.Node.Parent.Parent.Nodes.Count Then 'On décoche le noeud parent e.Node.Parent.Parent.Checked = False End If End If 'Sinon si le nombre est inférieur au nombre de noeuds enfants du parent alors ... ElseIf NoeudsCoches < e.Node.Parent.Nodes.Count Then 'On décoche le noeud parent e.Node.Parent.Checked = False If e.Node.Parent.Parent IsNot Nothing Then 'On compte le nombre de noeuds cochées dans le niveau racine NoeudsCoches = 0 For Each _Noeud As TreeNode In e.Node.Parent.Parent.Nodes If _Noeud.Checked Then NoeudsCoches += 1 End If Next If NoeudsCoches = e.Node.Parent.Parent.Nodes.Count Then 'On coche le noeud parent e.Node.Parent.Parent.Checked = True ElseIf NoeudsCoches < e.Node.Parent.Parent.Nodes.Count Then 'On décoche le noeud parent e.Node.Parent.Parent.Checked = False End If End If End If End If End Sub
OUI je crois
YEEEEEEEEEEEEES !!! T'as réussi !!!
T'es un as dis-moi ! En tout cas je te remercie beaucoup pour ta patience et pour ton talent. Et même si tu aimes les défis je pense aussi que tu aimes rendre service aux autres. Chapeau !
@+
Ludo
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager