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

DevExpress实现TreeList向上递归获取公共父节点的方法

程序员文章站 2024-03-31 10:44:10
有时候在进行c#项目开发中,需要获取到公共节点,如下图所示: 譬如,当点击“test103-2”节点,其类型是“灯”类型,那怎么获取到“中心区域”这个类型是“地域”的...

有时候在进行c#项目开发中,需要获取到公共节点,如下图所示:

DevExpress实现TreeList向上递归获取公共父节点的方法

譬如,当点击“test103-2”节点,其类型是“灯”类型,那怎么获取到“中心区域”这个类型是“地域”的公共节点?对此具体实现方法如下:

主要功能代码如下:

/// <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;
}
/// <summary>
/// 向上递归节点
/// </summary>
/// <param name="node">需要向上递归的节点</param>
/// <param name="conditionhanlder">委托,返回fasle跳出递归;返回true继续递归;</param>
public static void upwardrecursivenode(this treelistnode node, predicate<treelistnode> conditionhanlder)
{
  treelistnode _parentnode = node.parentnode;
  if (_parentnode != null)
  {
 if (conditionhanlder(_parentnode))
 {
   upwardrecursivenode(_parentnode, conditionhanlder);
 }
  }
}
/// <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;
}

希望本文所述示例对大家进行类似的c#项目开发能有所帮助!