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:
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();
}
} |