Treeview et cocher noeud parent [Résolu]

cispo 103 Messages postés mardi 9 novembre 2004Date d'inscription 10 septembre 2007 Dernière intervention - 6 nov. 2006 à 11:18 - Dernière réponse : LUDINSKI 441 Messages postés mardi 2 décembre 2003Date d'inscription 22 mai 2012 Dernière intervention
- 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 !
Afficher la suite 

6 réponses

Répondre au sujet
LUDINSKI 441 Messages postés mardi 2 décembre 2003Date d'inscription 22 mai 2012 Dernière intervention - 6 nov. 2006 à 13:20
+3
Utile
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é ;)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de LUDINSKI
fregolo52 1106 Messages postés mercredi 15 juin 2011Date d'inscription 19 juillet 2016 Dernière intervention - 6 nov. 2006 à 11:31
0
Utile
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 ?
Commenter la réponse de fregolo52
cispo 103 Messages postés mardi 9 novembre 2004Date d'inscription 10 septembre 2007 Dernière intervention - 6 nov. 2006 à 13:15
0
Utile
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
Commenter la réponse de cispo
fregolo52 1106 Messages postés mercredi 15 juin 2011Date d'inscription 19 juillet 2016 Dernière intervention - 6 nov. 2006 à 15:31
0
Utile
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 !!!!
Commenter la réponse de fregolo52
cispo 103 Messages postés mardi 9 novembre 2004Date d'inscription 10 septembre 2007 Dernière intervention - 6 nov. 2006 à 19:19
0
Utile
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...
Commenter la réponse de cispo
LUDINSKI 441 Messages postés mardi 2 décembre 2003Date d'inscription 22 mai 2012 Dernière intervention - 9 nov. 2006 à 15:39
0
Utile
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à ;)
Commenter la réponse de LUDINSKI

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.