Treeview et cocher noeud parent [Résolu]

Signaler
Messages postés
103
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
10 septembre 2007
-
Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
-
Bonjour,

J'utilise un le controle TreeView. Je me suis abonné à l'évènement AfterCheck. Mon but est de pouvoir cocher le noeud parent si tous les noeufs fils sont cochés.

J'ai écris le code suivant :

if

(node
.Checked
) // node est un des noeufs fils{

bool check
;

foreach (TreeNode f_nodes
in node
.Parent
.Nodes
) //On récupere le noeud parent et on parcourt tous les noeufs fils{

if (f_nodes
.Tag
!= node
.Tag
) // différents de celui concerné{

if (f_nodes
.Checked
)

check
= true;

else

{

check
= false ;

break

}}

}

if (check
)

node
.Parent
.Checked
= true;}

Malheuresement cela ne fonctionne pas et l'application quitte sans lever d'erreur...

Quelqu'un a une idée sur la question ?

Merci d'avance !

6 réponses

Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
7
Salut

Je peux te proposer le code suivant :

// Méthode appelée lorsque l'état d'une case à cocher de la TreeView est modifié
private void treeView_AfterCheck( object sender, TreeViewEventArgs e )
{
    // Se désabonne à l'évènement
    treeView.AfterCheck -= new TreeViewEventHandler( treeView_AfterCheck );

    // Met les noeud fils puis les noeuds parents à jour (récursivement)
    UpdateChildNodes( e.Node );
    UpdateParentNodes( e.Node );

    // Se résabonne à l'évènement
    treeView.AfterCheck += new TreeViewEventHandler( treeView_AfterCheck );
}

// 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 )
{
    // 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;
        foreach( TreeNode node in childNode.Parent.Nodes )
        {
            if( ! node.Checked )
            {
                allAreChecked = false;
                break;
            }
        }

        // L'état de la case à cocher du noeud parent ne correspond pas à l'état de ses fils
        if( childNode.Parent.Checked != allAreChecked )
        {
            // Met à jour le noeud parent
            childNode.Parent.Checked = allAreChecked;
            UpdateParentNodes( childNode.Parent );
        }
    }
}

Satisfait ou remboursé ;)
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
salut,

peux-tu détailler ?
dit-nous ce qu'il se passe. A priori, ton code ne devrait pas générer d'erreur, sauf dans le cas où ton noeud courant est le seul fils, donc initialise ton bool, par sécurité.
Tu as toujours le meme résultat, quelque soit les noeuds cochés ?
Messages postés
103
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
10 septembre 2007
3
Après avoir initialisé le booleen check à false, j'obtiens le message d'erreur suivant :
Failed to load resources from resource file. Please check your setup
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
ah ah, toi aussi tu as eu ce super message : Failed to load resources from resource file. Please check your setup

Ce message est un peu l'équivalent de segmentation fault, du truc du style, sous Linux. En gros, ça plante mais on ne sait pas pourquoi.
C'est quand même bizarre qu'une erreur se produise quand tu initialises une variable !!!!
Messages postés
103
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
10 septembre 2007
3
Merci LUDINSKI, le code fonctionne parfaitement.

Je n'ai pas cherché, mais je suppose que l'erreur que j'obtiens vient de l'abonnement/désabonnement à l'évènement...
Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
7
Ben en fait...
A chaque fois que tu modifiais la propriété Checked
, l'évènement

AfterCheck était déclenché.
Donc ton programme tournait en boucle et allouait chaque fois un peu plus de mémoire...

A un moment, il n'y avait plus assez de mémoire pour pouvoir initialiser une nouvelle variable et puis paf !

Voilà ;)