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 ?
Partager