2 Stimmen

Wie man TreeView Verhalten für TreeNodes, dass, wenn Sie eine überprüfen, es überprüft alle seine Kinder TreeNodes?

Das ist dasselbe wie bei den meisten Anwendungen. Ich dachte, TreeView funktioniert standardmäßig so.

Gibt es eine Möglichkeit, dies zu tun, oder muss ich alle Kinder eines TreeNode erhalten, die überprüft wird und überprüfen Sie sie selbst?

Dies ist Winforms.

7voto

Fredrik Mörk Punkte 151006

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 ).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X