Sie müssen es selbst tun, was aber nicht sehr schwer ist:
private void TreeView_AfterCheck(object sender, TreeViewEventArgs e)
{
SetChildrenChecked(e.Node, e.Node.Checked);
}
private void SetChildrenChecked(TreeNode treeNode, bool checkedState)
{
foreach (TreeNode item in treeNode.Nodes)
{
item.Checked = checkedState;
}
}
Auf diese Weise werden alle untergeordneten Knoten überprüft und deaktiviert (unabhängig davon, wie viele Ebenen tiefer es untergeordnete Knoten geben kann).
Update
Erweitertes Codebeispiel, das auch den übergeordneten Knoten prüft/deaktiviert, wenn alle seine untergeordneten Knoten manuell geprüft oder deaktiviert werden (nicht gründlich getestet, könnte wahrscheinlich eleganter gemacht werden):
private void TreeView_AfterCheck(object sender, TreeViewEventArgs e)
{
SetChildrenChecked(e.Node, e.Node.Checked);
if (e.Node.Parent != null)
{
bool setParentChecked = true;
foreach (TreeNode node in e.Node.Parent.Nodes)
{
if (node.Checked != e.Node.Checked)
{
setParentChecked = false;
break;
}
}
if (setParentChecked)
{
e.Node.Parent.Checked = e.Node.Checked;
}
}
}
private void SetChildrenChecked(TreeNode treeNode, bool checkedState)
{
foreach (TreeNode item in treeNode.Nodes)
{
if (item.Checked != checkedState)
{
item.Checked = checkedState;
}
}
}
Der if-Block, der in der Datei SetChildrenChecked
Methode verhindert eine StackOverflowException
Wenn Sie einen Knoten mit untergeordneten Knoten prüfen, werden diese geprüft, und wenn der letzte geprüft ist, wird der übergeordnete Knoten (der, auf den Sie geklickt haben) geprüft und löst die AfterCheck
Ereignis wieder (was mich etwas überrascht; ich hätte nicht erwartet, dass das Ereignis ausgelöst wird, wenn die Checked
Der Wert der Eigenschaft ändert sich nicht, sondern bekommt einfach denselben Wert zugewiesen, den er bereits hatte, aber dann wird das Ereignis wieder aufgerufen AfterCheck , nicht AfterCheckedChanged ).