TreeView et CheckBox

Signaler
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007
-
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007
-
Hello,

Je cherche un moyen de savoir quel checkbox est coché dans la liste et en fonction de cela appliquer un code, je m'éxplique :

Avant je fesais ceci :

                   if (this.checkBox1.Checked == true)
                   {
                    //code...
                   }
                   if (this.checkBox2.Checked == true)
                   {
                        //code...
                   }

Comment faire avec les checkBox d'un TreeView? qui est dans mon cas treeView1? Merci d'avance!

12 réponses

Messages postés
168
Date d'inscription
jeudi 28 juin 2001
Statut
Membre
Dernière intervention
18 octobre 2008
7
Salut,

Tu peux utiliser la propriété Checked des TreeNode :
foreach (TreeNode node in treeView1.Nodes)
{
    if (node.Checked)
    {
       // Faire ce qu'il faut ici...
    }
}
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

Donc ce serait ceci?
if (node1.Checked)
{
code
}

Je suis débutant et j'avoue qu'avec les treeviews je suis un peu perdu...
Messages postés
168
Date d'inscription
jeudi 28 juin 2001
Statut
Membre
Dernière intervention
18 octobre 2008
7
Ok alors voilà pour les explications :

Quand tu utilises un TreeView, tu y ajoutes des noeuds. Chaque noeud peut lui-même contenir des noeuds. D'où l'analogie avec les arbres et les branches :

TreeNode node1 = new TreeNode("Première racine");
TreeNode node2 = new TreeNode("Seconde racine");

TreeNode node3 = new TreeNode("Enfant de la seconde racine");

node2.Nodes.Add(node3);

treeView1.Nodes.Add(node1);
treeView1.Nodes.Add(node2);

Avec ça tu obtiens l'arbre suivant :
|-- Première racine
|--Seconde racine
   |-- Enfant de la seconde racine

Pour parcourir les noeuds de premier niveau (les noeuds racine), tu parcours les noeuds de la liste treeView1.Nodes :
foreach (TreeNode node in treeView1.Nodes)
{
    MessageBox.Show(node.Text);
}
ou
for (int i = 0; i < treeView1.Nodes.Length; i++)
{
    MessageBox.Show(treeView1.Nodes[i].Text);
}

Ce code affiche deux boîtes de dialogue avec dedans : "Première racine" puis "Seconde racine".
Tu peux aussi accéder à chaque noeud de la manière suivante :
TreeNode premiereRacine = treeView1.Nodes[0];
TreeNode secondeRacine = treeView1.Nodes[1];

Pour obtenir les éléments de la seconde racine (c'est à dire "Enfant de la seconde racine"), tu peux utiliser le code suivant :
TreeNode enfant = secondeRacine.Nodes[0];
ou
TreeNode enfant = treeView1.Nodes[1].Nodes[0];

Pour savoir comment parcourir les noeuds enfants des noeuds enfants, etc. Je t'invite à regarder quelques cours sur la récursivité.

Maintenant, pour faire simple et pour revenir à ta question, si ton code est le suivant :
TreeNode checkNode1 = new TreeNode("Cochez moi 1");
TreeNode checkNode2 = new TreeNode("Cochez moi 2");
TreeNode checkNode3 = new TreeNode("Cochez moi 3");


treeView1.Nodes.Add(checkNode1);

treeView1.Nodes.Add(checkNode2);

treeView1.Nodes.Add(checkNode3);

Tu pourras vérifier si les cases 1, 2 et 3 sont cochées en faisant quelque part dans ton code :
if (
treeView1.Nodes[0].Checked) // Première case
{
    // Ton code ici...
}
if (
treeView1.Nodes[1].Checked) // Deuxième case

{

    // Ton code ici...

}
if (
treeView1.Nodes[2].Checked) // Troisième case

{

    // Ton code ici...

}

J'espère avoir été compréhensible
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

Hello,

Mille merci pour cet explication qui est très bien détaillé, je pense que ça ne peux pas être plus clair!

Par la même occasion, vu que vous avez l'air calé dans ce sujet, je souhaiterais savoir comment faire pour que quand on sélectionne un checkbox racine, tous ces enfants soient séléctionnés? Et que quand on séléctionne un enfant le checkbox racine se remplit d'un carré vert? J'ai vu sa sur certains installeurs de logiciels. (J'éspère être compréhensible)
J'ai cherché dans pas mal de forum et sur google ,mais je n'ai pas vraiment trouvé mon bonheur...  Une idée?

Amicalement
Messages postés
168
Date d'inscription
jeudi 28 juin 2001
Statut
Membre
Dernière intervention
18 octobre 2008
7
Pour cocher tous les noeuds enfants, il faut passer par une fonction récursive et l'événement AfterCheck (ou BeforeCheck) :

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
    this.CheckNodes(e.Node);
}

private void CheckNodes(TreeNode root)
{
    foreach (TreeNode child in root.Nodes)
    {
       child.Checked = root.Checked;
       this.CheckNodes(child);
    }
}

Pour le carré vert, il s'agit de l'état Indeterminate (cf. propriété CheckState des CheckBox). Mais cet état n'est pas disponible pour les cases des TreeView.
Il existe quelques implémentations de TreeView avec cases à trois états :
http://www.codeproject.com/useritems/Three_State_TreeView.asp
... il faut être anglophone
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

Merci tout marche à merveille!
Pour le TreeView avec cases à trois états seriez-vous prêt à m'aider pour le mettre en forme dans mon project? Car je suis loin d'être anglophone...  

Amicalement
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

J'ai une deuxième question, quand est-il de l'évenement CheckedChanged? Existe-t-il pour les checkBox d'un TreeView? J'ai essayé comme ceci mais erreur de compilation...
private

void treeView1.Nodes[1]_CheckedChanged(
object sender,
TreeViewEventArgs e)
{
}
Messages postés
168
Date d'inscription
jeudi 28 juin 2001
Statut
Membre
Dernière intervention
18 octobre 2008
7
Ce que tu as écris signifie juste que tu déclares une méthode qui s'appelle


treeView1.Nodes[1]_CheckedChanged.
Malheureusement, les points et les crochets ne sont pas autorisés dans les noms d'identifiants (noms de variables, de méthode, de classe, etc.)



Pour savoir si une case a été cochée, il faut intercepter l'événement AfterCheck du TreeView (et non BeforeCheck comme je l'avais suggéré précédemment : parce qu'à ce moment là, la case n'a pas encore été cochée).
Pour intercepté cet événement, il faut déclarer une méthode AfterCheck

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
    // Le code ici...
}

Mais aussi dire qu'elle correspond à un événement (on aurait pu appeler cette méthode toto que ça n'y aurait rien changé ). Pour ça, soit tu le fais dans le concepteur de Forms :
- Tu cliques sur le TreeView
- Dans la fenêtre Propriétés, tu cliques sur Evenements (ça ressemble à un éclair)
- Et tu double-cliques sur "AfterCheck".
Sinon, dans le constructeur de ta Form, tu peux ajouter la ligne suivante (après InitializeComponents) :
this.treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck);

--> ça permet au TreeView de savoir que lorsqu'il déclenche l'événement AfterCheck, il faut qu'il appelle ta méthode treeView1_AfterCheck.
Pour récupérer l'élement qui vient d'être coché, utilise la propriété Node de l'objet TreeViewEventArgs qui est fournit lors de l'événement.

Et pis... s'pa dur de lire des tutos de prog en anglais : y'a une centaine de mots à connaître et la plupart sont employés en français.

Bonne prog.
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

Merci encore pour toutes ces explications!

Mon problème c'est qu'avant pour chaques checkbox je fesais appel à la même fonction comme ceci :

private
void checkBox1_CheckedChanged(
object sender,
EventArgs e) {MaPetiteFonction();

}

Et pareils pour tous les autres... Mais la même dans l'évenement AfterCheck je ne vois vraiment pas comment faire...

Pour se qui est du treeview avec cases à trois états, je n'ai pas compris grand chose, et je pense qu'il ne faut pas tout prendre, car il y a des parties pour tout développer et tout réduire si je ne me trompe pas. (Désolé j'ai du mal à débuter...)

 
Messages postés
303
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
24 avril 2009
5
En fait, la fonction récursive ici est inutile. Dans le code ci-dessous, tous les enfants sont (dé)cochés puisque la propriété "Checked" changée sur chacun des Nodes redéclenche l'évenement.



private






void
treeView1_AfterCheck(

object
sender,

TreeViewEventArgs
e )
{
   

TreeNode
node = e.Node;
   

foreach
(

TreeNode
child

in
node.Nodes )
   child.Checked = node.Checked;
}



Eric
Messages postés
303
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
24 avril 2009
5
Pour répondre a ta question sur le fonctionnement sur AfterCheck, tu doit le voir d'une manière différente.


En effet, quand tu faisais checkbox1.CheckedChanged, tu te servait de "sender" pour définir le checkbox, ou bien directement de "checkbox1", puisque cet évenement était déclenché par le check d'un checkbox précis.

Ici, l'évenement AfterCheck est déclenché par le (dé)cochage d'un des Nodes de ton arbre, peu importe lequel. Pour savoir de quel node il S'agit, il te suffit de te servir de l'attribut "Node" de l'objet TreeViewEventArgs .

Ainsi, "e.Node" te donnera accès au node sélectionné, tandis que "sender" te donnera accès à l'arbre complet dans lequel réside ce Node.

J'espère que cette explication est claire

Eric
Messages postés
89
Date d'inscription
vendredi 29 octobre 2004
Statut
Membre
Dernière intervention
3 décembre 2007

Hello,

Merci pour ces compléments d'informations, j'éssais d'apprendre le plus possible, pourriez-vous me faire un exemple de se que je souhaiterais faire? (car même avc ttes ces explications tout ca reste flou...)

Amicalement