zoukankan      html  css  js  c++  java
  • TreeView CheckBox勾选联动

    http://www.cnblogs.com/excellently/p/TreeViewCheckBox.html

     在C# Winform项目中用到了TreeView控件,并且需要勾选的功能。父子节点联动,需要实现如下:

         1.当选中父节点的时候,如果它的子节点有没有选中的,则选中。

         2.当取消选中父节点的时候,将所有子节点都取消选中。

         3.当选中子节点的时候,要判断它的父节点中的所有子节点,是不是都已经选中,如果都选中则选中父节点。

         4.当取消子节点的时候,要判断父节点是否已经被勾选上,如果勾选上则取消选中父节点。

         注意:所有的节点都有可能既是父节点,又是子节点。举例:当效果3满足时,选中了父节点,那么这个父节点有自己的父节点,那么就要再执行一遍效果3.

          

         如果我们处理了一个节点,那么这个节点相关联的父节点,和父节点的父节点,。。。,以及这个节点的子节点,和这个节点的子节点。。。,都会发生联动反应。所以我在处理这个问题的时候,用到了递归。

         TreeView有一个事件:AfterCheck。我们不用去命名新的递归,直接用这个事件,当勾选了一个节点的时候,会进入这个事件,在这个事件内用代码去勾选节点的时候,也会触发这个事件。AfterCheck的参数就是勾选的节点。;对于我联动勾选节点的情况而言,这个就是递归。

          勾选节点联动代码,只要在AfterCheck事件内编写代码就可以达到效果,下面是代码,没有注释:

            private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
            {
                try
                {
                    if (e.Node.Nodes.Count > 0)
                    {
                        bool NoFalse = true;
                        foreach (TreeNode tn in e.Node.Nodes)
                        {
                            if (tn.Checked == false)
                            {
                                NoFalse = false;
                            }
                        }
                        if (e.Node.Checked == true || NoFalse)
                        {
                            foreach (TreeNode tn in e.Node.Nodes)
                            {
                                if (tn.Checked != e.Node.Checked)
                                {
                                    tn.Checked = e.Node.Checked;
                                }
                            }
                        }
                    }
                    if (e.Node.Parent != null && e.Node.Parent is TreeNode)
                    {
                        bool ParentNode = true;
                        foreach (TreeNode tn in e.Node.Parent.Nodes)
                        {
                            if (tn.Checked == false)
                            {
                                ParentNode = false;
                            }
                        }
                        if (e.Node.Parent.Checked != ParentNode && (e.Node.Checked == false || e.Node.Checked == true && e.Node.Parent.Checked == false))
                        {
                            e.Node.Parent.Checked = ParentNode;
                        }
                    }
                }
                catch (Exception ex)
                {
                   
                }
            }

            上面已经写的很详细了,注释我就不写了。

  • 相关阅读:
    分布式锁没那么难,手把手教你实现 Redis 分布锁!|保姆级教程
    我去,这么简单的条件表达式竟然也有这么多坑
    MySQL 可重复读,差点就让我背上了一个 P0 事故!
    用了这么多年的 Java 泛型,你对它到底有多了解?
    项目一再跳票?试试这一招:用Deadline倒逼生产力
    Code Review最佳实践
    你的大学会有模拟面试吗?一些常见面试问题背后的逻辑是什么?
    从软件工程的角度解读任正非的新年公开信
    记在美国的一次校园招聘
    为什么软件工程教科书上的内容和现实的软件项目之间存在着一定差异?
  • 原文地址:https://www.cnblogs.com/zkwarrior/p/9127358.html
Copyright © 2011-2022 走看看