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
|
private bool supressAfterCheckEvents = false;
/// <summary>
/// Wird ausgelöst, wenn ein Element gewählt wurde
/// </summary>
/// <param name="sender">Sender des Events</param>
/// <param name="e">Event Args</param>
private void laufTree_AfterCheck(object sender, TreeViewEventArgs e)
{
if (supressAfterCheckEvents) return;
supressAfterCheckEvents = true;
UpdateChildren(e.Node);
UpdateParent(e.Node);
supressAfterCheckEvents = false;
this.ListChanged.Invoke(this, EventArgs.Empty);
}
/// <summary>
/// Ändert die Kinder auf den checked-Status des Vaters
/// </summary>
/// <param name="node">Knoten, der geändert wurde</param>
private void UpdateChildren(TreeNode node)
{
foreach (TreeNode treeNode in node.Nodes)
{
treeNode.Checked = node.Checked;
UpdateChildren(treeNode);
};
}
/// <summary>
/// Akutalisiert den Parent und setzt die Checked-Eigenschaft auf True,
/// wenn mindestens ein Kind usgewählt wurde
/// </summary>
/// <param name="n">Knoten, der geändert wurde</param>
private void UpdateParent(TreeNode n)
{
// Alle Parents auf den Status der Kinder ändern
TreeNode workingNode = n.Parent;
while (workingNode != null)
{
// Stanadardmäßig deselektiert
workingNode.Checked = false;
// Selektieren wenn mindestens ein Knoten ausgewählt wurde
foreach (TreeNode treeNode in workingNode.Nodes)
{
workingNode.Checked = workingNode.Checked || treeNode.Checked;
if (workingNode.Checked) break; // Einmal True ist immer True
}
// Neuer Parent ist der Parent des aktuellen Knotens
workingNode = workingNode.Parent;
}
}
|