如何获取TreeNodes的TreeView行为,当您检查一个时,它会检查其所有子TreeNodes?

Joa*_*nge 2 .net c# treeview winforms

这与大多数应用程序的行为方式相同.我认为TreeView默认工作就像那样.

有没有办法做到这一点,或者我必须得到一个TreeNode的所有子项已经检查并自己检查?

这是winforms.

Fre*_*örk 7

你需要自己做,而另一方面不是很难:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这需要检查和取消选中所有子项(无论子节点可能有多少级别).

更新
扩展的代码示例,如果手动检查或取消选中所有子节点,也会检查/取消选中父节点(未经过全面测试,可能更优雅地完成):

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

SetChildrenChecked方法中添加的if-block 将阻止StackOverflowException在检查具有子节点的节点的情况下,检查它们,并且在检查最后一个节点时,父节点(您单击的节点)将被中断并触发AfterCheck再次发生事件(这让我感到惊讶;我不希望在Checked属性值没有改变的情况下引发事件,而只是为它分配了它已经拥有的相同值,但是事件再次被称为AfterCheck,而不是AfterCheckedChanged).