• 大概是这么个样子:

 

  • 大概是这么个思路:

  当变更(点击)节点的选中状态的时候,同步更新所有子节点(包括子节点的子节点)状态,并且判断所有兄弟节点的状态若都是选中状态,更新父级节点状态为选中,否则,更新父节点(包括父节点的父节点)为未选中状态。

  • 划重点:

  要点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

 

版权声明:本文为hicolin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/hicolin/p/10113953.html