欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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代码可以参考:

说明:

DevExpress实现TreeList节点互斥的方法

如上图所示,节点“test3”和“蒙自路test2”都是"cab"类型;
当调用代码如下:

treelistnode _node = e.node;
_node.syncmutexnodecheckstate(_node.checkstate, n => n.getnodetype() == nodetype.cab);

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