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