TreeView选择子节点的父节点和所选父节点的childes

时间:2012-02-25 12:36:39

标签: c# winforms treeview

我正在使用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函数它可以工作,但是当我有这两个函数时,即使我的表单没有加载也没有任何事情发生

2 个答案:

答案 0 :(得分:2)

不要使用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;
}

答案 1 :(得分:0)

请尝试在CheckChildren_ParentSelected中调用SelectParents。

编辑: 抱歉,在SelectParents里面调用CheckChildren_ParentSelected。