DevExpress实现TreeList节点互斥的方法
程序员文章站
2024-02-18 12:19:34
本文实例讲述了devexpress实现treelist节点互斥的方法,具体实现方法如下所示:
主要功能代码如下:
///
//...
本文实例讲述了devexpress实现treelist节点互斥的方法,具体实现方法如下所示:
主要功能代码如下:
/// <summary> /// 节点互斥同步 /// 说明 /// eg: ///treelistnode _node = e.node; ///_node.syncmutexnodecheckstate(_node.checkstate, n => n.getnodetype() == nodetype.cab); /// </summary> /// <param name="node">需要互斥同步的节点</param> /// <param name="checkstate">节点状态</param> /// <param name="checkhanlder">互斥条件【委托】</param> public static void syncmutexnodecheckstate(this treelistnode node, checkstate checkstate, predicate<treelistnode> checkhanlder) { treelist _tree = node.treelist; if (checkhanlder(node))//当前节点符合互斥条件时候 { _tree.downrecursivetree(n => n.checkstate = checkstate.unchecked); } else { treelistnode _curparentnode = node.getparentnode(checkhanlder);//获取符合互斥条件的父节点 if (_curparentnode == null) return; treelistnode _thepublenode = node.getpublicparentnode(checkhanlder);//获取符合互斥条件的公共父节点 if (_thepublenode == null) return; foreach (treelistnode n in _thepublenode.nodes) { foreach (treelistnode nc in n.nodes) { if (nc != _curparentnode) { nc.checkstate = checkstate.unchecked; nc.downrecursivenode(nr => nr.checkstate = checkstate.unchecked); } } } } node.syncnodecheckstate(checkstate); node.checkstate = checkstate; } } /// <summary> /// 向上递归,获取符合条件的节点的公共父节点 /// </summary> /// <param name="node">操作节点</param> /// <param name="checkhanlder">委托</param> /// <returns>符合条件的节点</returns> public static treelistnode getpublicparentnode(this treelistnode node, predicate<treelistnode> checkhanlder) { treelistnode _publicpnode = null; treelistnode _findnode = node.getparentnode(checkhanlder);//先获取到条件判断的自身父节点 if (_findnode != null) { //开始向上递归 upwardrecursivenode(_findnode, n => { treelistnode _curpublicnode = n.parentnode;//获取当前向上递归的父节点 if (_curpublicnode != null) { if (_curpublicnode.nodes.count > 1)//若有多个子节点,则是公共父节点 { _publicpnode = _curpublicnode; return false;//跳出递归 } } return true;//继续递归 }); } return _publicpnode; } /// <summary> /// 向上递归,获取符合条件的父节点 /// </summary> /// <param name="node">需要向上递归的节点</param> /// <param name="conditionhanlder">判断条件【委托】</param> /// <returns>符合条件的节点【treelistnode】</returns> public static treelistnode getparentnode(this treelistnode node, predicate<treelistnode> conditionhanlder) { treelistnode _parentnode = node.parentnode;//获取上一级父节点 treelistnode _conditonnode = null; if (_parentnode != null) { if (conditionhanlder(_parentnode))//判断上一级父节点是否符合要求 { _conditonnode = _parentnode; } if (_conditonnode == null)//若没有找到符合要求的节点,递归继续 _conditonnode = getparentnode(_parentnode, conditionhanlder); } return _conditonnode; }
syncnodecheckstate代码可以参考:
说明:
如上图所示,节点“test3”和“蒙自路test2”都是"cab"类型;
当调用代码如下:
treelistnode _node = e.node; _node.syncmutexnodecheckstate(_node.checkstate, n => n.getnodetype() == nodetype.cab);
实现的效果就是要么只能勾选“test3”或者“蒙自路test2”节点或者子节点,不同同时勾选,应该就是互斥的意思;也是这段代码想实现的效果,希望对大家的项目开发有所帮助。
推荐阅读
-
DevExpress实现TreeList父子节点CheckState状态同步的方法
-
DevExpress实现TreeList向上递归获取符合条件的父节点
-
DevExpress实现TreeList按条件隐藏节点CheckBox的方法
-
DevExpress中GridControl列转义的实现方法
-
DevExpress实现自定义TreeListNode的Tooltip的方法
-
DevExpress实现GridControl列头绘制Checkbox的方法
-
DevExpress设置TreeList图片节点背景色的方法
-
MySQL实现树状所有子节点查询的方法
-
DevExpress实现自定义GridControl中按钮文字内容的方法
-
DevExpress实现为TextEdit设置水印文字的方法