IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Treeview et checkbox père et fils


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Développeur
    Inscrit en
    Mai 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2012
    Messages : 19
    Par défaut Treeview et checkbox père et fils
    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();
                    }
                }

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 256
    Par défaut
    Bonjour,

    Voilà comment je ferais pour résoudre ton problème. En espérant que cela t'aide
    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 void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
            {
                treeView1.AfterCheck -= new TreeViewEventHandler(treeView1_AfterCheck);
     
                // cocher tout en remontant (vers les parents)
                TreeNode tn = e.Node.Parent;
     
                while(tn != null)
                {
                    bool aUnNodeNonCoche = false;
     
                    foreach (TreeNode fils in tn.Nodes)
                    {
                        if (!fils.Checked)
                        {
                            aUnNodeNonCoche = true;
                            break;
                        }
                    }
     
                    tn.Checked = !aUnNodeNonCoche;
                    tn = tn.Parent;
                }
     
                // cocher les fils
                cocherFils(e.Node, e.Node.Checked);
     
                treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck);
            }
     
            private void cocherFils(TreeNode tn, bool cocher)
            {
                if (tn == null)
                    return;
     
                foreach (TreeNode node in tn.Nodes)
                {
                    node.Checked = cocher;
                    cocherFils(node, cocher);
                }
            }

Discussions similaires

  1. Treeview hiérarchique (lien pére-fils)
    Par ktorvik dans le forum Développement Sharepoint
    Réponses: 3
    Dernier message: 04/08/2011, 14h58
  2. Treeview et tables avec 2 champs Père et fils
    Par BEN NASR dans le forum Delphi
    Réponses: 4
    Dernier message: 14/05/2007, 16h48
  3. Père et fils sous-formulaire
    Par manujuggler dans le forum Access
    Réponses: 7
    Dernier message: 05/01/2006, 16h20
  4. TreeView et checkbox
    Par BigBenQ dans le forum C++Builder
    Réponses: 5
    Dernier message: 02/08/2005, 08h27
  5. [C#] TreeView avec CheckBox "indeterminate"
    Par padumeur dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/01/2005, 20h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo