C#(在TreeView中使用CheckBox)

本文介绍如何在C#中处理TreeView控件的CheckBox,实现父节点与子节点的勾选状态联动。当父节点被勾选,所有子节点自动勾选;反之,父节点不勾选时,子节点全部取消勾选。同时,根据子节点的勾选状态改变父节点的文本颜色:全选时黑色,全不选时黑色,部分选中时灰色。文中提供了具体的代码实现,包括递归处理多级节点的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树结构中的节点共有两层(父节点是分类名称子节点是属于该类的项的名称)都是从数据库中读出而且是在读出的过程中将具体的数据项名称进行分类的。要想实现: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 =true;

      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;

    }

   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值