C# TreeView检查/取消检查子代-有时只影响根

C# TreeView检查/取消检查子代-有时只影响根,c#,.net,winforms,treeview,C#,.net,Winforms,Treeview,考虑一个TreeView结构,例如: 目标是在检查特定节点时,让节点的子代相应地检查或取消检查自己。例如,在上面的示例中,如果未选中“D”,则“da”、“da”和“dab”应自行取消选中 目前使用的代码如下: private void treeView_AfterCheck(object sender, TreeViewEventArgs e) { if (e.Action != TreeViewAction.Unknown) { if (e.Node.Chec

考虑一个
TreeView
结构,例如:

目标是在检查特定节点时,让节点的子代相应地检查或取消检查自己。例如,在上面的示例中,如果未选中“D”,则“da”、“da”和“dab”应自行取消选中

目前使用的代码如下:

private void treeView_AfterCheck(object sender, TreeViewEventArgs e)
{
    if (e.Action != TreeViewAction.Unknown)
    {
        if (e.Node.Checked)
        {
            checkChildNodes(e.Node.Nodes);
        }
        else
        {
            uncheckChildNodes(e.Node.Nodes);
        }
    }
 }

private void checkChildNodes(TreeNodeCollection nodes)
{
    foreach (TreeNode node in nodes)
    {
        node.Checked = true;

        if (node.Nodes.Count>0)
            checkChildNodes(node.Nodes);
    }
}

private void uncheckChildNodes(TreeNodeCollection nodes)
{
    foreach (TreeNode node in nodes)
    {
        node.Checked = false;

        if (node.Nodes.Count>0)
            uncheckChildNodes(node.Nodes);
    }
}
这样做的问题是,当快速单击“根”节点时,有时不会检查/取消检查子体。如何解决这个问题


还尝试了使用
BeforeCheck
事件,如下链接所示:

是否在
node.Checked=…”时调用
treeView\u AfterCheck
取消选中ChildNodes
方法中更改了code>?如果是,则添加一个
bool isAdjusting=false变量。在
treeView\u AfterCheck
方法中,输入
if(isAdjusting)返回;i调整=正确
然后设置
isAdjusting=false结尾。是否在
node.Checked=…]时调用
treeView_AfterCheck
取消选中ChildNodes
方法中更改了code>?如果是,则添加一个
bool isAdjusting=false变量。在
treeView\u AfterCheck
方法中,输入
if(isAdjusting)返回;i调整=正确
然后设置
isAdjusting=false在末尾。