Dev treelist 常用用法小结

要求如下:

1:选择父节点后,子节点全部打钩;
2:选择子节点而不选择父节点,则从当前节点的父节点一直到根节点check框都是半选状态。
3:当子节点均未勾选时,设置父节点状态为:未选中状态
具体实现如下:
一、OptionView—ShowCheckBoxes属性为true,则每个节点前面自动增加一个check框。
二、设置OptionBehavior—AllIndeterminateCheckState属性为true,则check框可以出现半选状态。

具体代码显示如下:

#region 树形 点击节点前  
       /// <summary>    
       /// 点击节点前    
       /// </summary>    
       /// <param name="sender"></param>    
       /// <param name="e"></param>    
       private void treeList_BeforeCheckNode(object sender, CheckNodeEventArgs e)  
       {  
           if (!this.ifMultipleChoice)  
           {  
               //选择前取消前面已经选择的,实现单选功能  
               List<DevExpress.XtraTreeList.Nodes.TreeListNode> treeListNodes = treeList.GetAllCheckedNodes();  
               foreach (DevExpress.XtraTreeList.Nodes.TreeListNode node in treeListNodes)  
               {  
                   node.Checked = false;  
               }  
           }  
           e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked);  
       }  
       #endregion  
 
       #region 树形 点击节点后  
       /// <summary>    
       /// 点击节点后    
       /// </summary>    
       /// <param name="sender"></param>    
       /// <param name="e"></param>    
       private void treeList_AfterCheckNode(object sender, NodeEventArgs e)  
       {  
           if (!this.ifMultipleChoice)  
           {  
               return;  
           }  
           if (e.Node == null)  
           {  
               return;  
           }  
           if (e.Node.CheckState == CheckState.Indeterminate)  
           {  
               e.Node.CheckState = CheckState.Checked;  
           }  
           if (e.Node.CheckState == CheckState.Checked)  
           {  
               if (e.Node.HasChildren)  
               {  
                   this.CheckNode(e.Node);  
               }  
               this.ValidParentIsChecked(e.Node);  
           }  
           else if (e.Node.CheckState == CheckState.Unchecked)  
           {  
               if (e.Node.HasChildren)  
               {  
                   this.SetCheckedChildNodes(e.Node, CheckState.Unchecked);  
               }  
               //从根节点往下 查询 是否有打钩的子节点,如果有那么 父节点的 半选状态不变 否则变为 不选择状态    
               //this.ValidParentNodeIsCanleSel(e.Node);  
               SetCheckedParentNodes(e.Node, e.Node.CheckState);  
  
           }  
       }  
       #endregion  
 
       #region 树形 节点操作集合  
       /// <summary>    
       /// 选择某个节点及其子节点    
       /// </summary>    
       /// <param name="node"></param>    
       private void CheckNode(DevExpress.XtraTreeList.Nodes.TreeListNode node)  
       {  
           foreach (DevExpress.XtraTreeList.Nodes.TreeListNode cnode in node.Nodes)  
           {  
               if (cnode != null)  
               {  
                   cnode.CheckState = CheckState.Checked;  
               }  
               if (cnode.HasChildren)  
               {  
                   CheckNode(cnode);  
               }  
           }  
       }  
  
       /// <summary>    
       /// 勾选子节点后,修改父节点的状态    
       /// </summary>    
       /// <param name="node"></param>    
       private void ValidParentIsChecked(DevExpress.XtraTreeList.Nodes.TreeListNode node)  
       {  
           if (node.ParentNode != null)  
           {  
               //父节点未被选中    
               if (node.ParentNode.CheckState == CheckState.Unchecked)  
               {  
                   //该节点有子节点 并且  该节点与子节点均被选中    
                   if (node.HasChildren && ValidIsCheckAllChildNode(node.ParentNode))  
                   {  
                       node.ParentNode.CheckState = CheckState.Checked;  
                   }  
                   //该节点没有子节点 并且 其父节点下的子节点均被选中    
                   else if ((!node.HasChildren) && ValidIsCheckAllChildNode(node.ParentNode))  
                   {  
                       node.ParentNode.CheckState = CheckState.Checked;  
                   }  
                   else  
                   {  
                       node.ParentNode.CheckState = CheckState.Indeterminate;  
                   }  
               }  
               else if (node.ParentNode.CheckState == CheckState.Indeterminate)  
               {  
                   //该节点有子节点并且 子节点均未被选中时,修改其状态     
                   if (node.HasChildren && (!this.ValidIsHasCheckChildNode(node)))  
                   {  
                       node.ParentNode.CheckState = CheckState.Unchecked;  
                   }  
                   // 该节点的父节点下所有节点均被选中 ValidIsCheckAllChildNode    
                   else if (ValidIsCheckAllChildNode(node.ParentNode))  
                   {  
                       node.ParentNode.CheckState = CheckState.Checked;  
                   }  
               }  
               this.ValidParentIsChecked(node.ParentNode);  
           }  
       }  
  
       /// <summary>    
       /// 从该节点往下 查询 是否有打钩的子节点,如果有那么 父节点的 半选、选中状态不变否则变为 不选择状态    
       /// </summary>    
       /// <param name="node"></param>    
       private void ValidParentNodeIsCanleSel(DevExpress.XtraTreeList.Nodes.TreeListNode node)  
       {  
           bool isSel = false;  
           if (node.ParentNode != null)  
           {  
               if (node.ParentNode.CheckState == CheckState.Indeterminate)  
               {  
                   //如果父节点的 状态为 半选 状态 这 根据父节点 判断子节点是否打钩    
                   isSel = ValidIsHasCheckChildNode(node.ParentNode);  
                   if (isSel == false)  
                   {  
                       //如果所有的 子节点 都没有 “选中”那么 父节点的状态 变为 非选中状态    
                       node.ParentNode.CheckState = CheckState.Unchecked;  
                   }  
               }  
               this.ValidParentNodeIsCanleSel(node.ParentNode);  
           }  
       }  
  
       /// <summary>    
       /// 判断该节点下是否有节点被选中,如果有返回true    
       /// </summary>    
       /// <param name="node"></param>    
       /// <returns></returns>    
       private bool ValidIsHasCheckChildNode(DevExpress.XtraTreeList.Nodes.TreeListNode node)  
       {  
           bool isCheck = false;  
           foreach (DevExpress.XtraTreeList.Nodes.TreeListNode cnode in node.Nodes)  
           {  
               if (cnode != null)  
               {  
                   if (cnode.CheckState == CheckState.Checked)  
                   {  
                       isCheck = true;  
                       return isCheck;  
                   }  
               }  
               if (cnode.HasChildren)  
               {  
                   isCheck = this.ValidIsHasCheckChildNode(cnode);  
                   if (isCheck == true)  
                   {  
                       return isCheck;  
                   }  
               }  
           }  
           return isCheck;  
       }  
       /// <summary>    
       /// 节点全选    
       /// </summary>    
       /// <param name="node"></param>    
       /// <returns></returns>    
       private bool ValidIsCheckAllChildNode(DevExpress.XtraTreeList.Nodes.TreeListNode node)  
       {  
           bool isCheck = true;  
           foreach (DevExpress.XtraTreeList.Nodes.TreeListNode cnode in node.Nodes)  
           {  
               if (cnode != null)  
               {  
                   if (cnode.CheckState == CheckState.Unchecked)  
                   {  
                       isCheck = false;  
                       return isCheck;  
                   }  
               }  
               if (cnode.HasChildren)  
               {  
                   isCheck = this.ValidIsCheckAllChildNode(cnode);  
                   if (isCheck == false)  
                   {  
                       return isCheck;  
                   }  
               }  
           }  
           return isCheck;  
       }  
 
 
       #endregion  
 
       #region  树形 获取全部子节点  
       private void GetChildNodes(TreeListNode parentNode, List<TreeListNode> list)  
       {  
           if (parentNode == null)  
           {  
               return;  
           }  
           if (parentNode.Nodes.Count > 0)  
           {  
               foreach (TreeListNode node in parentNode.Nodes)  
               {  
                   list.Add(node);  
                   if (node.Nodes.Count > 0)  
                   {  
                       GetChildNodes(node, list);  
                   }  
               }  
           }  
       }  
       #endregion  
 
       #region 树形 选择子节点时触发  
       /// <summary>    
       /// 选择子节点时触发    
       /// </summary>    
       /// <param name="node"></param>    
       /// <param name="check"></param>    
       private void SetCheckedChildNodes(TreeListNode node, CheckState check)  
       {  
           foreach (TreeListNode tn in node.Nodes)  
           {  
               tn.CheckState = check;  
               if (tn.HasChildren)  
               {  
                   SetCheckedChildNodes(tn, check);  
               }  
           }  
       }  
       #endregion  
 
       #region  树形 选择父节点时触发  
       /// <summary>    
       /// 选择父节点时触发    
       /// </summary>    
       /// <param name="node"></param>    
       /// <param name="check"></param>    
       private void SetCheckedParentNodes(TreeListNode node, CheckState check)  
       {  
           if (node.ParentNode != null)  
           {  
               bool b = false;  
               CheckState state;  
               foreach (TreeListNode tln in node.ParentNode.Nodes)  
               {  
                   state = (CheckState)tln.CheckState;  
                   if (!check.Equals(state))  
                   {  
                       b = !b;  
                       break;  
                   }  
               }  
               node.ParentNode.CheckState = b ? CheckState.Indeterminate : check;  
               SetCheckedParentNodes(node.ParentNode, check);  
           }  
       }  
       #endregion  
 
       #region 树形 判断此节点下的所有孩子节点是否选中  
       /// <summary>    
       /// 判断此节点下的所有孩子节点是否选中    
       /// </summary>    
       /// <param name="node"></param>    
       /// <returns></returns>    
       private Boolean IsChildsChecked(TreeListNode node)  
       {  
           foreach (TreeListNode tln in node.ParentNode.Nodes)  
           {  
               if (tln.CheckState == CheckState.Unchecked)  
               {  
                   return false;  
               }  
               if (tln.HasChildren)  
               {  
                   IsChildsChecked(tln);  
               }  
           }  
           return true;  
       }  
       #endregion  


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值