private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
this.treeView1.AfterCheck -= new TreeViewEventHandler(treeView1_AfterCheck);
if (e.Node.Parent != null && e.Node.Checked != e.Node.Parent.Checked)
{
bool childcheck = true;
foreach (TreeNode childnode in e.Node.Parent.Nodes)
{
if (childnode.Checked != e.Node.Checked) childcheck = false;
}
if (childcheck) e.Node.Parent.Checked = e.Node.Checked;
} if (e.Node.Nodes.Count > 0)
{
foreach (TreeNode childnode in e.Node.Nodes)
{
childnode.Checked = e.Node.Checked;
}
}
this.treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck);
}
这个是可以执行的语句,能帮我注释一下每行到底什么意思吗?找不到解释的文章。
因为我想把里面的功能改动一下,当子选项和父选项都已经打钩的时候,取消一个子选项的钩,父选项的钩也自动取消。
{
this.treeView1.AfterCheck -= new TreeViewEventHandler(treeView1_AfterCheck);
if (e.Node.Parent != null && e.Node.Checked != e.Node.Parent.Checked)
{
bool childcheck = true;
foreach (TreeNode childnode in e.Node.Parent.Nodes)
{
if (childnode.Checked != e.Node.Checked) childcheck = false;
}
if (childcheck) e.Node.Parent.Checked = e.Node.Checked;
} if (e.Node.Nodes.Count > 0)
{
foreach (TreeNode childnode in e.Node.Nodes)
{
childnode.Checked = e.Node.Checked;
}
}
this.treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck);
}
这个是可以执行的语句,能帮我注释一下每行到底什么意思吗?找不到解释的文章。
因为我想把里面的功能改动一下,当子选项和父选项都已经打钩的时候,取消一个子选项的钩,父选项的钩也自动取消。
{
this.treeView1.AfterCheck -= new TreeViewEventHandler(treeView1_AfterCheck); ///把事件减掉,防止死循环。
if (e.Node.Parent != null && e.Node.Checked != e.Node.Parent.Checked)
{
bool childcheck = true;
foreach (TreeNode childnode in e.Node.Parent.Nodes)
{
if (childnode.Checked != e.Node.Checked) childcheck = false;
}
if (childcheck) e.Node.Parent.Checked = e.Node.Checked; ///当子选项都打钩或都不打勾的时候,父选项跟着打钩或不打勾。
} if (e.Node.Nodes.Count > 0)
{
foreach (TreeNode childnode in e.Node.Nodes)
{
childnode.Checked = e.Node.Checked; ///设置所有的子选项跟父选项一样。
}
}
this.treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck); ///重新把事件加回来
}
{
this.treeView1.AfterCheck -= new TreeViewEventHandler(treeView1_AfterCheck); //除去treeView1_AfterCheck事件
if (e.Node.Parent != null && e.Node.Checked != e.Node.Parent.Checked) //如果满足节点有父节点,状态和父节点选择状态不一样就执行if中间的代码 {
bool childcheck = true; //变量childcheck 赋值为true foreach (TreeNode childnode in e.Node.Parent.Nodes) //遍历当前所选择的节点的父节点下的所有节点 {
if (childnode.Checked != e.Node.Checked) childcheck = false; //如果节点与选择节点的状态不一样,变量childcheck 赋值为false
} if (childcheck) e.Node.Parent.Checked = e.Node.Checked; //如果变量childcheck 为true ,即所有的节点都是选择的,父节点也成选择的状态
} if (e.Node.Nodes.Count > 0) //如果节点有子节点
{
foreach (TreeNode childnode in e.Node.Nodes) //将它子节点全部选择中
{
childnode.Checked = e.Node.Checked;
}
}
this.treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck); //把treeView1_AfterCheck事件重新加上
}
{
foreach (TreeNode childnode in e.Node.Parent.Nodes)
{
if (!childnode.Checked)
{ e.Node.Checked=false;
break;
}
}
}
这样改一下可以实现你要的功能。
错了,应该是if (e.Node.Parent != null )
{
if (!e.Node.Checked)
{
e.Node.Parent.Checked=false;
}
}