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函数,它会起作用,但当我同时拥有这两个函数时,即使我的表单没有加载,也不会发生任何事情
不要使用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;
}
编辑:很抱歉在SelectParents中调用CheckChildren_ParentSelected。