Treeview et cocher noeud parent

Résolu
cispo Messages postés 103 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 10 septembre 2007 - 6 nov. 2006 à 11:18
LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 - 9 nov. 2006 à 15:39
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 !
A voir également:

6 réponses

LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 8
6 nov. 2006 à 13:20
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é ;)
1
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
6 nov. 2006 à 11:31
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 ?
0
cispo Messages postés 103 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 10 septembre 2007 3
6 nov. 2006 à 13:15
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
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
6 nov. 2006 à 15:31
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 !!!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cispo Messages postés 103 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 10 septembre 2007 3
6 nov. 2006 à 19:19
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...
0
LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 8
9 nov. 2006 à 15:39
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à ;)
0
Rejoignez-nous