分享

TreeView CheckBox勾选联动

 正则室 2018-06-07

TreeView CheckBox勾选联动

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

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

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

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

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

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

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

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

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

[csharp] view plain copy
  1. private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)  
  2. {  
  3.     try  
  4.     {  
  5.         if (e.Node.Nodes.Count > 0)  
  6.         {  
  7.             bool NoFalse = true;  
  8.             foreach (TreeNode tn in e.Node.Nodes)  
  9.             {  
  10.                 if (tn.Checked == false)  
  11.                 {  
  12.                     NoFalse = false;  
  13.                 }  
  14.             }  
  15.             if (e.Node.Checked == true || NoFalse)  
  16.             {  
  17.                 foreach (TreeNode tn in e.Node.Nodes)  
  18.                 {  
  19.                     if (tn.Checked != e.Node.Checked)  
  20.                     {  
  21.                         tn.Checked = e.Node.Checked;  
  22.                     }  
  23.                 }  
  24.             }  
  25.         }  
  26.         if (e.Node.Parent != null && e.Node.Parent is TreeNode)  
  27.         {  
  28.             bool ParentNode = true;  
  29.             foreach (TreeNode tn in e.Node.Parent.Nodes)  
  30.             {  
  31.                 if (tn.Checked == false)  
  32.                 {  
  33.                     ParentNode = false;  
  34.                 }  
  35.             }  
  36.             if (e.Node.Parent.Checked != ParentNode && (e.Node.Checked == false || e.Node.Checked == true && e.Node.Parent.Checked == false))  
  37.             {  
  38.                 e.Node.Parent.Checked = ParentNode;  
  39.             }  
  40.         }  
  41.     }  
  42.     catch (Exception ex)  
  43.     {  
  44.   
  45.     }  
  46. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约