A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈君 金牌黑马   /  2014-8-23 23:20  /  961 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这篇文章主要介绍了DevExpress实现TreeList节点互斥的方法,对于初学者更好的理解C#有一定的帮助,需要的朋友可以参考下
本文实例讲述了DevExpress实现TreeList节点互斥的方法,具体实现方法如下所示:
主要功能代码如下:
  1. /// <summary>
  2. /// 节点互斥同步
  3. /// 说明
  4. /// eg:
  5. ///TreeListNode _node = e.Node;
  6. ///_node.SyncMutexNodeCheckState(_node.CheckState, n => n.GetNodeType() == NodeType.Cab);
  7. /// </summary>
  8. /// <param name="node">需要互斥同步的节点</param>
  9. /// <param name="checkState">节点状态</param>
  10. /// <param name="checkHanlder">互斥条件【委托】</param>
  11. public static void SyncMutexNodeCheckState(this TreeListNode node, CheckState checkState, Predicate<TreeListNode> checkHanlder)
  12. {
  13. TreeList _tree = node.TreeList;
  14. if (checkHanlder(node))//当前节点符合互斥条件时候
  15. {
  16. _tree.DownRecursiveTree(n => n.CheckState = CheckState.Unchecked);
  17. }
  18. else
  19. {
  20. TreeListNode _curParentNode = node.GetParentNode(checkHanlder);//获取符合互斥条件的父节点
  21. if (_curParentNode == null) return;
  22. TreeListNode _thePubleNode = node.GetPublicParentNode(checkHanlder);//获取符合互斥条件的公共父节点
  23. if (_thePubleNode == null) return;
  24. foreach (TreeListNode n in _thePubleNode.Nodes)
  25. {
  26. foreach (TreeListNode nc in n.Nodes)
  27. {
  28. if (nc != _curParentNode)
  29. {
  30. nc.CheckState = CheckState.Unchecked;
  31. nc.DownRecursiveNode(nr => nr.CheckState = CheckState.Unchecked);
  32. }
  33. }
  34. }
  35. }
  36. node.SyncNodeCheckState(checkState);
  37. node.CheckState = checkState;
  38. }
  39. }
  40. /// <summary>
  41. /// 向上递归,获取符合条件的节点的公共父节点
  42. /// </summary>
  43. /// <param name="node">操作节点</param>
  44. /// <param name="checkHanlder">委托</param>
  45. /// <returns>符合条件的节点</returns>
  46. public static TreeListNode GetPublicParentNode(this TreeListNode node, Predicate<TreeListNode> checkHanlder)
  47. {
  48. TreeListNode _publicPNode = null;
  49. TreeListNode _findNode = node.GetParentNode(checkHanlder);//先获取到条件判断的自身父节点
  50. if (_findNode != null)
  51. {
  52. //开始向上递归
  53. UpwardRecursiveNode(_findNode, n =>
  54. {
  55. TreeListNode _curpublicNode = n.ParentNode;//获取当前向上递归的父节点
  56. if (_curpublicNode != null)
  57. {
  58. if (_curpublicNode.Nodes.Count > 1)//若有多个子节点,则是公共父节点
  59. {
  60. _publicPNode = _curpublicNode;
  61. return false;//跳出递归
  62. }
  63. }
  64. return true;//继续递归
  65. });
  66. }
  67. return _publicPNode;
  68. }
  69. /// <summary>
  70. /// 向上递归,获取符合条件的父节点
  71. /// </summary>
  72. /// <param name="node">需要向上递归的节点</param>
  73. /// <param name="conditionHanlder">判断条件【委托】</param>
  74. /// <returns>符合条件的节点【TreeListNode】</returns>
  75. public static TreeListNode GetParentNode(this TreeListNode node, Predicate<TreeListNode> conditionHanlder)
  76. {
  77. TreeListNode _parentNode = node.ParentNode;//获取上一级父节点
  78. TreeListNode _conditonNode = null;
  79. if (_parentNode != null)
  80. {
  81. if (conditionHanlder(_parentNode))//判断上一级父节点是否符合要求
  82. {
  83. _conditonNode = _parentNode;
  84. }
  85. if (_conditonNode == null)//若没有找到符合要求的节点,递归继续
  86. _conditonNode = GetParentNode(_parentNode, conditionHanlder);
  87. }
  88. return _conditonNode;
  89. }
复制代码

SyncNodeCheckState代码可以参考:http://www.jb51.net/article/53335.htm
说明: 如上图所示,节点“Test3”和“蒙自路Test2”都是"cab"类型;
当调用代码如下:
  1. TreeListNode _node = e.Node;
  2. _node.SyncMutexNodeCheckState(_node.CheckState, n => n.GetNodeType() == NodeType.Cab);
复制代码

实现的效果就是要么只能勾选“Test3”或者“蒙自路Test2”节点或者子节点,不同同时勾选,应该就是互斥的意思;也是这段代码想实现的效果,希望对大家的项目开发有所帮助。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马