DevExpress TreeList使用
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using DevExpress.XtraBars;
using DevExpress.XtraTreeList;
using DevExpress.XtraTreeList.Nodes; namespace DevExpressUtilHelpV3
{
public static class TreeListToolV3
{
public delegate string BuildPathRule(string nodeText, string fullPathInfo);
/// <summary>
/// 获取选中节点到根节点的所有信息
/// </summary>
/// <param name="focusedNode">TreeListNode</param>
/// <param name="columnID">列名称</param>
/// <param name="buildPathRule">规则委托</param>
/// <returns>路径信息</returns>
public static string FullPathInfo(this TreeListNode focusedNode, string columnID, BuildPathRule buildPathRule)
{
if (focusedNode == null)
throw new ArgumentNullException("focusedNode");
if (string.IsNullOrEmpty("columnID"))
throw new ArgumentNullException("columnID");
string _fullPathInfo = string.Empty;
_fullPathInfo = focusedNode.GetDisplayText(columnID);
while (focusedNode.ParentNode != null)
{
focusedNode = focusedNode.ParentNode;
string _nodeText = focusedNode.GetDisplayText(columnID).Trim();
_fullPathInfo = buildPathRule(_nodeText, _fullPathInfo);
}
return _fullPathInfo;
}
public delegate bool CompareNodeRule(TreeListNode focusedNode);
/// <summary>
/// 获取筛选节点到根节点的所有信息
/// </summary>
/// <param name="focusedNode">TreeListNode</param>
/// <param name="columnID">列名称</param>
/// <param name="compareNodeRule">规则委托</param>
/// <param name="buildPathRule">规则委托</param>
/// <returns>路径信息</returns>
public static string FilterPathInfo(this TreeListNode focusedNode, string columnID, CompareNodeRule compareNodeRule, BuildPathRule buildPathRule)
{
if (focusedNode == null)
throw new ArgumentNullException("focusedNode");
if (string.IsNullOrEmpty("columnID"))
throw new ArgumentNullException("columnID");
string _fullPathInfo = string.Empty;
_fullPathInfo = focusedNode.GetDisplayText(columnID);
while (focusedNode.ParentNode != null)
{
focusedNode = focusedNode.ParentNode;
if (compareNodeRule(focusedNode))
{
string _nodeText = focusedNode.GetDisplayText(columnID).Trim();
_fullPathInfo = buildPathRule(_nodeText, _fullPathInfo);
}
}
return _fullPathInfo;
}
/// <summary>
/// 递归遍历树节点
/// </summary>
/// <param name="tree"></param>
/// <param name="opreateRule"></param>
public static void LoopTree(this TreeList tree, Action<TreeListNode> opreateRule)
{
if (tree == null)
throw new ArgumentNullException("tree");
foreach (TreeListNode node in tree.Nodes)
{
opreateRule(node);
if (node.Nodes.Count > )
{
LoopTreeNodes(node, opreateRule);
}
}
}
/// <summary>
/// 递归遍历TreeListNode节点
/// </summary>
/// <param name="node"></param>
/// <param name="opreateRule"></param>
public static void LoopTreeNodes(this TreeListNode node, Action<TreeListNode> opreateRule)
{
if (node == null)
throw new ArgumentNullException("node");
foreach (TreeListNode _childNode in node.Nodes)
{
opreateRule(_childNode);
LoopTreeNodes(_childNode, opreateRule);
}
}
/// <summary>
/// 递归遍历TreeListNode,当opreateRule返回false停止循环
/// </summary>
/// <param name="node">TreeListNode</param>
/// <param name="opreateRule">Func<TreeListNode, bool></param>
public static void LoopTreeNodes_Break(this TreeListNode node, Func<TreeListNode, bool> opreateRule)
{
if (node == null)
throw new ArgumentNullException("node");
foreach (TreeListNode _childNode in node.Nodes)
{
if (!opreateRule(_childNode))
break;
LoopTreeNodes_Break(_childNode, opreateRule);
}
}
/// <summary>
/// 递归遍历TreeListNode,当opreateRule返回false跳出循环,直接进入下次循环
/// </summary>
/// <param name="node">TreeListNode</param>
/// <param name="opreateRule">Func<TreeListNode, bool></param>
public static void LoopTreeNodes_Continue(this TreeListNode node, Func<TreeListNode, bool> opreateRule)
{
if (node == null)
throw new ArgumentNullException("node");
foreach (TreeListNode _childNode in node.Nodes)
{
if (!opreateRule(_childNode))
continue;
LoopTreeNodes_Continue(_childNode, opreateRule);
}
}
public delegate bool CheckNodeRule(TreeListNode fucusedNode);
public delegate void CheckNodeNullRule();
/// <summary>
/// 节点为null检查
/// </summary>
/// <param name="fucusedNode">TreeListNode</param>
/// <param name="checkNodeRule">若为NULL,处理逻辑</param>
/// <returns>TreeListNode</returns>
public static TreeListNode CheckNull(this TreeListNode fucusedNode, CheckNodeNullRule checkNodeRule)
{
if (fucusedNode == null)
{
checkNodeRule();
return null;
}
return fucusedNode;
}
/// <summary>
/// 正对节点的检查逻辑
/// </summary>
/// <param name="fucusedNode">TreeListNode</param>
/// <param name="checkNodeRule">检查逻辑代码[委托]</param>
/// <returns>TreeListNode</returns>
public static TreeListNode Check(this TreeListNode fucusedNode, CheckNodeRule checkNodeRule)
{
if (fucusedNode != null)
return checkNodeRule(fucusedNode) == true ? fucusedNode : null;
return null;
}
/// <summary>
/// 水平滚动条
/// </summary>
/// <param name="tree">TreeList</param>
public static void HorzScroll(this TreeList tree)
{
if (tree == null)
throw new ArgumentNullException("tree");
tree.OptionsView.AutoWidth = false;
tree.BestFitColumns();
tree.HorzScrollVisibility = ScrollVisibility.Always;
}
/// <summary>
/// 为TreeList附加右键菜单
/// MouseUp(object sender, MouseEventArgs e)事件中调用
/// </summary>
/// <param name="tree">TreeList</param>
/// <param name="e">MouseEventArgs</param>
/// <param name="menu">PopupMenu</param>
/// <param name="attachMenuRule">AttachMenuRule</param>
public static void AttachMenu(this TreeList tree, MouseEventArgs e, PopupMenu menu, Func<TreeListNode, bool> attachMenuRule)
{
if (tree == null)
throw new ArgumentNullException("tree");
if (menu == null)
throw new ArgumentNullException("menu");
if (e.Button == MouseButtons.Right && Control.ModifierKeys == Keys.None && tree.State == TreeListState.Regular)
{
Point _point = new Point(Cursor.Position.X, Cursor.Position.Y);
TreeListHitInfo _hitInfo = tree.CalcHitInfo(e.Location);
if (_hitInfo.HitInfoType == HitInfoType.Cell)
tree.SetFocusedNode(_hitInfo.Node);
if (attachMenuRule(tree.FocusedNode))
menu.ShowPopup(_point);
}
}
/// <summary>
/// 设置父节点的状态AfterCheckNode(object sender, NodeEventArgs e)
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
public static void ProcessNodeCheckState(this TreeListNode node, CheckState check)
{
if (node == null)
throw new ArgumentNullException("node");
SetCheckedChildNodes(node, check);
SetCheckedParentNodes(node, check);
}
/// <summary>
/// 设置子节点CheckState
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
private static void SetCheckedChildNodes(TreeListNode node, CheckState check)
{
if (node != null)
{
node.LoopTreeNodes((TreeListNode _node) =>
{
_node.CheckState = check;
});
}
}
/// <summary>
/// 设置父节点CheckState
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
private static void SetCheckedParentNodes(TreeListNode node, CheckState check)
{
if (node.ParentNode != null)
{
bool _checkStatus = false;
CheckState _nodeState;
node.LoopTreeNodes_Break((TreeListNode _node) =>
{
_nodeState = _node.CheckState;
if (!check.Equals(_nodeState))
{
_checkStatus = !_checkStatus;
return false;//跳出循环
}
return true;//继续循环
});
node.ParentNode.CheckState = _checkStatus ? CheckState.Indeterminate : check;
SetCheckedParentNodes(node.ParentNode, check);
}
}
/// <summary>
/// 根据CheckState获取TreeListNode
/// </summary>
/// <param name="tree">TreeList</param>
/// <param name="state">CheckState</param>
/// <param name="GetNodesByStateRule">返回True的时候继续</param>
/// <returns>TreeListNode集合</returns>
public static List<TreeListNode> GetNodesByState(this TreeList tree, CheckState state, Func<TreeListNode, bool> GetNodesByStateRule)
{
if (tree == null)
throw new ArgumentNullException("tree");
List<TreeListNode> _checkNodes = new List<TreeListNode>();
tree.LoopTree((TreeListNode node) =>
{
if (GetNodesByStateRule(node))
{
if (node.CheckState == state)
_checkNodes.Add(node);
}
});
return _checkNodes;
}
}
}
DevExpress TreeList使用的更多相关文章
- Devexpress TreeList控件绑定显示父子节点对像
今天一位同事咨询Devexpress TreeList控件绑定自动显示父子节点对像,但结果是不会显示带父子节点关系,而是将所有的节点作为父节点显示出来了,对像类的代码如下 public class I ...
- 如何让DevExpress TreeList的每个结点高亮显示?
概述:如何让DevExpress TreeList的每个节点高亮显示? 如何让DXperience TreeList的每个节点高亮显示? 效果如下: private void treeList1_Cu ...
- How to easily create popup menu for DevExpress treelist z
http://www.itjungles.com/how-to-easily-create-popup-menu-for-devexpress-treelist.html Adding popup m ...
- DevExpress TreeList使用教程之绑定多级树
DevExpress TreeList使用教程之绑定多级树 概述:TreeList控件可以同时显示树结构和其他数据列,即在一个列上建立父子关系展开或收缩,同时还可以显示其他列的内容.在TreeLi ...
- DevExpress TreeList 全选和反选 z
/// <summary> /// 全选树 /// </summary> /// <param name="tree">树控件</para ...
- Devexpress treelist 树形控件 实现带三种状态的CheckBox
树形控件是使用频率很高的一种控件.对于属性控件往往需要下面两个功能 1.TreeList带有CheckBox,并且节点要有三种状态(所有的子节点都选中,所有的子节点都没选择,一部分子节点选中).使用 ...
- Devexpress TreeList选择父级联动
Treelist当显示复选框后,父级和子级的复选框没有关联,使用过程中很不便,如图所示 自己给treelist添加父子级联动 /// <summary> /// 初始化TreeList,父 ...
- DevExpress TreeList 拖动时中如何判断源节点作为目标节点的子节点还是兄弟节点
目的:只允许同级拖动. 两个判断: 1.原节点(假设为:S)的父级如果不等于目标节点(假设为:T)的父节点,那么发生了跨级,即非同级移动.这个判断很容易. 2.S.T是同一级的,但是S是移动到T下一级 ...
- Devexpress TreeList 展开和折叠当前选中节点
1.展开: private void barButtonItem6_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) ...
- DevExpress TreeList用法总结
http://blog.itpub.net/29251214/viewspace-774395/ http://blog.csdn.net/czp_huster/article/details/501 ...
随机推荐
- bzoj 1040 基向内环树dp
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk mak ...
- "The /usr/local directory is not writable."解决方法
sudo chown -R $(whoami) /usr/local brew prune
- C#读取csv文件使用字符串拼接成XML
phone.csv zhangsan1, zhangsan2, zhangsan3, static void Main(string[] args) { //XML //XML就是一个文件,用来存储数 ...
- summernote图片上传功能保存到服务器指定文件夹+php代码+java方法
1.summernote富文本编辑器 summernote是一款基于bootstrap的富文本编辑器,是一款十分好用的文本编辑器,还附带有图片和文件上传功能. 那么在我们网站中想吧这个图片上传到服务器 ...
- 141. Linked List Cycle【Easy】【判断链表是否存在环】
Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked lis ...
- Python3 文件操作基本语法
对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 f = open('lyrics') #打开文件 first_line = f.readline() prin ...
- IoC控制反转和DI依赖注入
控制反转(Inversion of Control,英文缩写为IoC)是框架的重要特征,并非面向对象编程的专用术语.它与依赖注入(Dependency Injection,简称DI ...
- 【Kubernetes】在K8s中创建StatefulSet
在K8s中创建StatefulSet 遇到的问题: 使用Deployment创建的Pod是无状态的,当挂在Volume之后,如果该Pod挂了,Replication Controller会再run一个 ...
- Linux基础系列-系统密码破解
无引导介质(光盘.iso)救援模式下root密码破解 第一步: GRUB启动画面读秒时按上下方向键,进入GRUB界面 第二步: 使用上下光标键选择要修改的操作系统启动内核(默认选择的即可),按e键进行 ...
- 【思路】Gym - 101173F - Free Figurines
套娃形成一些链形结构,给你套娃的初始状态和目标状态,问你需要几步(将最外层套娃打开,以及将一整套套娃塞进一个空套娃都算一步)才能达到. 容易发现,只有每条链链尾的匹配段可以不拆,其他的都得拆开. #i ...