自己想要做一个TreeView,点击节点的CheckBox能让其子节点及父节点做出相应的事件。
也不知道是不是自己的搜索方式不对,只能找到个近似的框架,通过自己修改以达到自己的要求。
现将自己的需求及代码贴上,希望能对有类似需求的同学们有帮助~~
要求:
1.父节点勾选,则子节点全部勾选;
2.父节点不勾选,则子节点全部不勾选;
3.子节点部分勾选,则父节点不勾选;
4.子节点全部勾选,则父节点被勾选;
就是这么一个简单的功能,自己改了1~2天,才把原先的一些问题解决,现在应该是能满足以上要求了~
#region check选择事件
private bool nextCheck(TreeNode n) //判断同级的节点是否全选
{
foreach (TreeNode tn in n.Parent.Nodes)
{
if (tn.Checked == false) return false;
}
return true;
}
private bool nextNotCheck(TreeNode n) //判断同级的节点是否全不选
{
if (n.Checked == true)
{
return false;
}
if(n.NextNode==null)
{
return true;
}
return this.nextNotCheck(n.NextNode);
}
private void cycleChild(TreeNode tn,bool check) //遍历节点下的子节点
{
if (tn.Nodes.Count != 0)
{
foreach (TreeNode child in tn.Nodes)
{
child.Checked = check;
if (child.Nodes.Count != 0)
{
cycleChild(child, check);
}
}
}
else
return;
}
private void cycleParent(TreeNode tn, bool check) //遍历节点上的父节点
{
if (tn.Parent!=null)
{
if (nextCheck(tn))
{
tn.Parent.Checked = true;
}
else
{
tn.Parent.Checked = false;
}
cycleParent(tn.Parent, check);
}
return;
}
// afterCheck
private void treeViewTest_AfterCheck(object sender, TreeViewEventArgs e) //当选中或取消选中树节点上的复选框时发生
{
//要求父节点被勾选,则子节点全部被勾选;父节点不被勾选,则子节点不全不被勾选
if (e.Node.Checked == true)
{
if (e.Action != TreeViewAction.Unknown)
{
cycleChild(e.Node, true);
}
if (e.Node.Parent != null)
{
if (nextCheck(e.Node))
{
cycleParent(e.Node,true);
}
else
{
cycleParent(e.Node, false);
}
}
}
if (e.Node.Checked == false)
{
if (e.Action != TreeViewAction.Unknown)
{
cycleChild(e.Node, false); //中间节点不选中则子节点全部不选中
cycleParent(e.Node, false); //父节点不选中
}
//bCheck = false;
}
return;
}
#endregion
至于TreeView 中加入CheckBox的话,只要把控件的属性 CheckBoxes改为True 就好了~~
代码写得很长,有什么不足的地方,欢迎指正。。。。
本文介绍如何在C#中实现TreeView控件的CheckBox点击事件,包括父节点与子节点间的联动勾选逻辑。详细展示了相关代码,包括`AfterCheck`事件处理、遍历子节点和父节点的函数,以及设置CheckBoxes属性为True来显示CheckBox。

3900

被折叠的 条评论
为什么被折叠?



