Dieses allgemein gehaltene Code Snippet ändert die Checked-Eigenschaft der Children und Parents eines TreeNodes nach folgender Mimik:
Checked = true:
- Kinder und Kindes-Kinder: Checked = true
- Vater und Großväter: Checked = true
Checked = false:
- Kinder und Kindes-Kinder: Checked = false
- Vater und Großväter:
- Checked = true wenn mind. ein Kind Checked=true
- Sonst Checked = false.
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;
}
}
Kommentare zum Snippet