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();
                }
            }