DevExpress实现TreeList节点互斥的方法

 更新时间:2014年08月06日 16:57:48   投稿:shichen2014  
这篇文章主要介绍了DevExpress实现TreeList节点互斥的方法,对于初学者更好的理解C#有一定的帮助,需要的朋友可以参考下

本文实例讲述了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代码可以参考:https://www.jb51.net/article/53335.htm

说明:

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

TreeListNode _node = e.Node;
_node.SyncMutexNodeCheckState(_node.CheckState, n => n.GetNodeType() == NodeType.Cab);

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

相关文章

  • C#调用Python模块的方法

    C#调用Python模块的方法

    这篇文章主要为大家详细介绍了C#调用Python模块的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • c#异步发送邮件的类

    c#异步发送邮件的类

    这篇文章主要介绍了使用c#异步发送邮件的类,大家参考使用吧
    2014-01-01
  • C#计算矩阵的秩实例分析

    C#计算矩阵的秩实例分析

    这篇文章主要介绍了C#计算矩阵的秩实现方法,以实例形式较为详细的分析了C#计算矩阵秩的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • 小白2分钟学会Visual Studio如何将引用包打包到NuGet上

    小白2分钟学会Visual Studio如何将引用包打包到NuGet上

    这篇文章主要介绍了小白2分钟学会Visual Studio如何将引用包打包到NuGet上,只需两步完成打包上传操作,需要的朋友可以参考下
    2021-09-09
  • C# wpf解决Popup弹出位置异常问题解决

    C# wpf解决Popup弹出位置异常问题解决

    本文主要介绍了C# wpf解决Popup弹出位置异常问题解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Unity Shader实现素描风格的渲染

    Unity Shader实现素描风格的渲染

    这篇文章主要为大家详细介绍了Unity Shader实现素描风格的渲染,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#实现缩放和剪裁图片的方法示例

    C#实现缩放和剪裁图片的方法示例

    这篇文章主要介绍了C#实现缩放和剪裁图片的方法,结合实例形式分析了C#针对图片属性的缩放、裁剪等相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • c#实现ini文件读写类分享

    c#实现ini文件读写类分享

    c#实现ini文件读写类分享,大家参考使用吧
    2013-12-12
  • 一文详解C#中重写(override)及覆盖(new)的区别

    一文详解C#中重写(override)及覆盖(new)的区别

    这篇文章主要为大家详细介绍了C#中重写(override)及覆盖(new)这两个关键词的区别,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C# 多线程处理List数据的示例代码

    C# 多线程处理List数据的示例代码

    这篇文章主要介绍了C# 多线程处理List数据的示例代码,帮助大家更好的理解和使用c#编程语言,感兴趣的朋友可以了解下
    2020-12-12

最新评论