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

2024-03-20

这与大多数应用程序的行为方式相同。我认为 TreeView 默认情况下是这样工作的。

有没有办法做到这一点,或者我是否必须获取已检查的 TreeNode 的所有子节点并自己检查它们?

这是winform。


你需要自己做,但另一方面这并不难:

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;
    }
}

这负责检查和取消检查所有子节点(无论下面可能有多少层子节点)。

Update
扩展的代码示例,如果手动检查或取消选中所有子节点,还将检查/取消选中父节点(未经过彻底测试,可能可以做得更优雅):

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;
        }
    }
}

添加到的 if 块SetChildrenChecked方法将防止StackOverflowException在您检查带有子节点的节点的情况下,它们会被检查,并且当检查最后一个节点时,父节点(您单击的那个)会被检查并触发AfterCheck再次发生事件(这让我有点惊讶;我不希望在Checked属性值不会改变,而只是被分配与已有的相同值,但随后该事件再次被调用检查后, not 选中后更改).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获得 TreeNodes 的 TreeView 行为,当您检查一个 TreeNodes 时,它会检查其所有子 TreeNodes? 的相关文章

随机推荐