lzyq878客服
  咨询电话:13551625391

lzyq88手机版

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

 简单实现,有问题欢迎大家指正。

 

winform支持 win10 缩放适配 参考我另外一篇:

winform 适配high dpi

, 1, 0, 9);