Winform TreeView实现多级目录Checkbox状态判断
- 大概是这么个样子:
- 大概是这么个思路:
当变更(点击)节点的选中状态的时候,同步更新所有子节点(包括子节点的子节点)状态,并且判断所有兄弟节点的状态若都是选中状态,更新父级节点状态为选中,否则,更新父节点(包括父节点的父节点)为未选中状态。
- 划重点:
要点1: treeView.CheckBoxes = true;
要点2:不能使用AfterCheck事件,会导致无限递归
要点3:递归更新状态
要点4:递归检查状态
- 代码片段:
1 /// <summary> 2 /// 更新子节点状态 3 /// </summary> 4 /// <param name="node"></param> 5 /// <param name="bl"></param> 6 void Changechild(TreeNode node, bool bl) 7 { 8 if (node.Level < 2) 9 { 10 foreach (TreeNode item in node.Nodes) 11 { 12 item.Checked = bl; 13 if (item.Level < 2) 14 { 15 Changechild(item, bl); 16 } 17 } 18 } 19 }
Changechild
/// <summary> /// 变更父节点状态 /// </summary> /// <param name="node"></param> /// <param name="bl"></param> void ChangeParent(TreeNode node, bool bl) { //判断兄弟节点是否全部选中 bool parentstate = true; if (bl) { foreach (TreeNode item in node.Parent.Nodes) { if (!item.Checked) { parentstate = false; break; } } } else { parentstate = false; } node.Parent.Checked = parentstate; if (node.Parent.Level >= 1) { ChangeParent(node.Parent, parentstate); } }
ChangeParent
/// <summary> /// 1级节点,判断子节点(2级)是否全部选中,只要有一个子节点未选中,则当前节点不选中 /// </summary> /// <param name="node"></param> /// <param name="bl"></param> void CheckChild(TreeNode node) { bool parentchecked = true; foreach (TreeNode item in node.Nodes) { if (!item.Checked)//只要有一个节点未选中,就不选中 { parentchecked = false; break; } } node.Checked = parentchecked; }
CheckChild
private void treeView1_MouseClick(object sender, MouseEventArgs e) { TreeNode node = treeView1.GetNodeAt(new Point(e.X, e.Y)); TreeViewHitTestInfo info = treeView1.HitTest(e.Location); if (info != null && info.Location == TreeViewHitTestLocations.StateImage) { Changechild(node, node.Checked); if (node.Level != 0) { ChangeParent(node, node.Checked); } } }
treeView1_MouseClick