zoukankan      html  css  js  c++  java
  • 在TreeView中使用CheckBox(c#)

    树结构中的节点共有两层(父节点是分类名称子节点是属于该类的项的名称)都是从数据库中读出而且是在读出的过程中将具体的数据项名称进行分类的。要想实现:treeview的AfterCheck事件中的:

        1.父节点勾选则子节点全部勾选

        2.父节点不勾选则子节点全部不勾选

        3.子节点全部不勾选则父节点不够选而且父节点的文本呈黑色

        4.子节点部分勾选则父节点不勾选而且文本呈灰色

        5.子节点全部勾选则父节点被勾选而且文本呈黑色

    private bool nextCheck(TreeNode n)//判断同级的节点是否全选

      {

       if(n.Checked==false)

        return false;

       if(n.NextNode == null)

        return true;

       return this.nextCheck(n.NextNode);

      }

      private bool nextNotCheck(TreeNode n)//判断同级的节点是否全不选

      {

       if(n.Checked==true)

        return false;

       if(n.NextNode == null)

        return true;

       return this.nextNotCheck(n.NextNode);

      }

      bool bCheck=false;

      private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)

      {

       if(bCheck)

        return;

       

       ///////////////////////////要求父节点被勾选则子节点全部被勾选;父节点不被勾选则子节点全部不被勾选////////////////////////

       if(e.Node.Parent==null&&e.Node.Nodes.Count!=0)//父节点

       { 

        if(e.Node.Checked==true)

        {

         for(int i=0;i<e.Node.Nodes.Count;i++)

         {

          if(e.Node.Nodes[i].Checked==false)

          {

           bCheck=true;

           e.Node.Nodes[i].Checked=true;//父节点选中则子节点全部选中

          }

         }

         e.Node.ForeColor=Color.Black;

         bCheck=false;

        }

        if(e.Node.Checked==false)

        {

         for(int i=0;i<e.Node.Nodes.Count;i++)

         {

          

          bCheck=true;

          e.Node.Nodes[i].Checked=false;//父节点不选中则子节点全部不选中

         

         }

         e.Node.ForeColor=Color.Black;

         bCheck=false;

        }

       

        return; 

        

       }

       ///要求子节点全部不勾选则父节点不被勾选且文本呈黑色;子节点部分被勾选则父节点不被勾选文本呈蓝色;子节点全部勾选则父节点被勾选且文本呈黑色///////

       if(e.Node.Parent!=null&&e.Node.Nodes.Count==0)//子节点

       {

        if(nextCheck(e.Node.Parent.FirstNode)==true)//全部勾选

        {

         bCheck=true;

         e.Node.Parent.Checked =true;

         e.Node.Parent.ForeColor =Color.Black ;

        }

        else if(nextNotCheck(e.Node.Parent.FirstNode)==true)//全部不勾选

        {

         bCheck=true;

         e.Node.Parent.Checked =false;

         e.Node.Parent.ForeColor =Color.Black ;

        }

        else

        {

         bCheck=true;

         e.Node.Parent.Checked =false;

         e.Node.Parent.ForeColor =Color.Gray;

        }

         bCheck=false;

        return;

       }

      }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

             以下是递归的多极节点的实现

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

     private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)

      {

       if( e.Action != TreeViewAction.Unknown )

       {

        //Event call by mouse or key-press

        SetNodeCheckStatus( e.Node, e.Node.Checked );

       }

      }

      private void SetNodeCheckStatus( TreeNode tn, bool Checked )

      {

       if( tn == null ) return;

       // Check children nodes

       foreach (TreeNode tnChild in tn.Nodes)

       {

        tnChild.Checked = Checked;

        SetNodeCheckStatus( tnChild, Checked );

       }

       // Set parent check status

       TreeNode tnParent = tn;

       int nNodeCount = 0;

       while( tnParent.Parent != null )

       {

        tnParent = (TreeNode)(tnParent.Parent);

        nNodeCount = 0;

        foreach( TreeNode tnTemp in tnParent.Nodes )

         if( tnTemp.Checked == Checked )

          nNodeCount++;

        if( nNodeCount == tnParent.Nodes.Count )

         tnParent.Checked = Checked;

        else

         tnParent.Checked = false;

       }

      }

  • 相关阅读:
    .NET应用架构设计—工作单位模式(摆脱程序代码的重要思想,反击DDD)
    ext Window点击右上角的关闭(Xbutton)加入监控事件
    HDU 2008 数字统计
    HTML5 CSS3 精美案例 : 达到VCD盒个性幻灯片
    Oracle表操作 (未完待续)
    oracle 统计语句 与常见函数的归纳(未完待续)
    Oracle 存储过程的创建,及触发器调用存储过程
    Oracle 数据乱码
    按列合并结果集
    Struts2 全局结果集-全局result节点设置,package设置abstract=true的实现
  • 原文地址:https://www.cnblogs.com/yuanermen/p/1167715.html
Copyright © 2011-2022 走看看