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 ...
随机推荐
- 【初探移动前端开发】jQuery Mobile 二
本文例子请使用手机查看 List列表 在移动设备平台下,由于移动设备屏幕比较小,我们又是用手在上面点击的触屏方式,传统的列表模式在手机上就不太友好了. 虽然HTML5与CSS3提供了强大的界面实现方案 ...
- H264(ES)如何打包成H264(PES)
http://blog.csdn.net/u013898698/article/details/64919036 http://blog.csdn.net/cabbage2008/article/de ...
- Flask实战第65天:帖子按照发布时间和评论数量等排序
排序,我们需要在前端传递参数, 编辑front_index.html 编辑front.views.py from apps.models import HighlightPostModel from ...
- 【SpringMVC】一次处理项目中文乱码的经历
一次处理项目中文乱码的经历 背景 今天把旧服务器上的项目转移到新服务器上,结果返回的json中的中文乱码了,觉得很奇怪,因为新服务器和旧服务器都是TX云,也不会有太大区别呀,于是乎开始了为期半天的蛋疼 ...
- 【BZOJ 2151】 2151: 种树 (贪心+堆+双向链表)
2151: 种树 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个 ...
- 【UOJ #201】【CTSC 2016】单调上升路径
http://uoj.ac/problem/201 别人都一眼秒的题对我而言怎么那么难qwq 这道题就是要构造一个n*n的邻接矩阵,满足矩阵\(A\)是一个拉丁方阵(也是数独?),\(a_{ij}=a ...
- BZOJ 2888 资源运输(启发式合并LCT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2888 [题目大意] 不断加边,问每个连通块的重心到其它点的距离和的和 [题解] 启发式 ...
- 【强连通分量缩点】【DFS】【动态规划】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem B. British Menu
有向图,不经过重复点的最长链,强连通分量大小不超过5. 每个强连通分量内部暴力预处理任意两对点之间的最长路,外面DAG上dp. 不是很好写,但是预处理完了之后,可以重构每个强连通分量内部的结构,然后整 ...
- 【CCpp程序设计2017】简单进销存
题目:简单进销存 功能要求: 实现如下的菜单(按数字选择菜单功能): 1. 显示存货列表 2. 入库 3. 出库 4. 退出程序 实现菜单对应功能(需记录货物的型号.数量等信息): 程序启动时从文件中 ...
- 【费用流】hdu5988 Coding Contest
从源点向每个点连接容量为该点人数,费用为1的边, 把原图中的每条边拆成两条,一条容量为1,费用为1,另一条容量为ci-1,费用为1-pi 从每个点向汇点连接容量为该点面包数量,费用为1的边. 跑的费用 ...