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