本文實例講述了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代碼可以參考://www.49028c.com/article/53335.htm
說明:
如上圖所示,節點“Test3”和“蒙自路Test2”都是"cab"類型;
當調用代碼如下:
TreeListNode _node = e.Node;_node.SyncMutexNodeCheckState(_node.CheckState, n => n.GetNodeType() == NodeType.Cab);
實現的效果就是要么只能勾選“Test3”或者“蒙自路Test2”節點或者子節點,不同同時勾選,應該就是互斥的意思;也是這段代碼想實現的效果,希望對大家的項目開發有所幫助。
新聞熱點
疑難解答