TreeView选择子节点的父节点和选定父节点的子节点

本文关键字:父节点 子节点 选择 TreeView | 更新日期: 2023-09-27 18:25:51

我使用的是Treeview,我已经找到了这两个函数,它们非常完美:

private void CheckChildren_ParentSelected(TreeNode node, Boolean isChecked)
    {
        foreach (TreeNode item in node.Nodes)
        {
            item.Checked = isChecked;
            if (item.Nodes.Count > 0)
            {
                this.CheckChildren_ParentSelected(item, isChecked);
            }
        }
    }

private void SelectParents(TreeNode node, Boolean isChecked)
    {
        //MessageBox.Show(node.Parent.ToString());
        if (node.Parent!=null)
        {
            node.Parent.Checked = isChecked;
            SelectParents(node.Parent, isChecked);
        }
    }

问题是:当我在AfterCheck事件中分别调用这些函数时,它们可以正常工作,但当在AfterCheck事件中同时调用它们时,即使我的表单没有加载,也不会发生任何事情

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
    {
        CheckChildren_ParentSelected(e.Node, e.Node.Checked);
        SelectParents(e.Node, e.Node.Checked);
       // MessageBox.Show("hi");
    }

这不起作用!但是当我评论其中一个时,例如SelectParents函数,它会起作用,但当我同时拥有这两个函数时,即使我的表单没有加载,也不会发生任何事情

TreeView选择子节点的父节点和选定父节点的子节点

不要使用MessageBox调试代码,请使用调试器。当您在事件处理程序上设置断点时,很容易看到这一点。或者Debug.Print()。更改Checked属性会导致AfterCheck事件处理程序再次运行。只需使用一个私有变量来防止递归:

private bool updatingTreeView;
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
    if (updatingTreeView) return;
    updatingTreeView = true;
    CheckChildren_ParentSelected(e.Node, e.Node.Checked);
    SelectParents(e.Node, e.Node.Checked);
    updatingTreeView = false;
}
请尝试在CheckChildren_ParentSelected中调用SelectParents。

编辑:很抱歉在SelectParents中调用CheckChildren_ParentSelected。