Bonjour, j'ai un treeview avec des checkbox.
Lorsque je coche/décoche le un père, les fils se décochent, mais quand je coche tous les fils le père se coche, mais le père du père ne se cochent pas, je souhaiterai résoudre ce bug . Si quelqu'un à une piste, je vous remercie.
Voici mon code
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 private void trv_Structures_AfterCheck(object sender, TreeViewEventArgs e) { // Se désabonne à l'évènement trv_Structures.AfterCheck -= new TreeViewEventHandler(trv_Structures_AfterCheck); // Met les noeud fils puis les noeuds parents à jour (récursivement) UpdateChildNodes(e.Node); UpdateParentNodes(e.Node); // Se résabonne à l'évènement trv_Structures.AfterCheck += new TreeViewEventHandler(trv_Structures_AfterCheck); foreach (TreeNode child in e.Node.Nodes) { child.Checked = e.Node.Checked; } } // Met à jour les noeuds fils d'un noeud private void UpdateChildNodes(TreeNode parentNode) { // Parcourt les noeuds fils foreach (TreeNode childNode in parentNode.Nodes) { // L'état de la case à cocher du fils est différent de celui du père if (childNode.Checked != parentNode.Checked) { // Met à jour les noeuds fils du noeud en cours childNode.Checked = parentNode.Checked; UpdateChildNodes(childNode); } } } // Met à jour les noeuds parents d'un noeud private void UpdateParentNodes(TreeNode childNode) { NiveauQouR(childNode, 1); //renseigne la variable NivQouR // Le noeud possède un noeud parent if (childNode.Parent != null) { // Récupère une valeur indiquant si tout les noeuds du même niveau sont cochés bool allAreChecked = true; int cpt = 0; int nb = 0; foreach (TreeNode node in childNode.Parent.Nodes) { cpt++; if (!node.Checked) { //MessageBox.Show("ok"); allAreChecked = false; nb++; //break; } } // L'état de la case à cocher du noeud parent ne correspond pas à l'état de ses fils if (childNode.Parent.Checked != allAreChecked) { //trv_Structures.BeginUpdate(); if (nb == cpt) { // Met à jour le noeud parent childNode.Parent.Checked = allAreChecked; UpdateParentNodes(childNode.Parent); } //trv_Structures.EndUpdate(); } }
Partager