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.
GFU-Schulungen [Anzeige]
C# AufbaukursSie haben grundlegende .NET- und C#-Kenntnisse und und wollen diese nun erweitern. Der Aufbaukurs C# führt Sie ein die Arbeit mit Interfaces und Delegates, Generics und Parallel Computing.
VB.NET AufbauSie verfügen nach der Schulung über fundierte Kenntnisse in der Arbeit mit objektorientierten Modellen in VB.NET und können wiederverwendbare Komponenten eigenständig erzeugen.
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