標籤:des winform style class blog code
關鍵代碼:
/// <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代碼參考:http://www.cnblogs.com/Yan-Zhiwei/p/3808089.html
說明:
,Test3和蒙自路Test2都是"cab"類型;
當調用代碼如下:
TreeListNode _node = e.Node; _node.SyncMutexNodeCheckState(_node.CheckState, n => n.GetNodeType() == NodeType.Cab);
實現的效果就是要麼只能勾選“Test3”或者“蒙自路Test2”節點或者子節點,不同同時勾選,應該就是互斥的意思;也是這段代碼想實現的效果,希望有所協助。