Dev TreeList常用用法
工作中经常用的的是第三发控件Developer Express,相信大家都知道它的强大功能,这次用到了TreeList做了一个权限的管理,发现TreeList非常好用,大家可以看它自带的 Demo就知道了,功能很多,这里我就把我用到的说出来,大家一起交流学习。
Skelta BPM.NET(全球第一.NET工作流引擎) | Visual WebGui (完美的用户界面解决方案) |
List & Label(图表报表生成控件) | DXperience Uni Premium 白金版(慧都独家) |
TreeList有一个KeyFieldName和ParentFieldName,这2个非常重要,只要构造一个DataTable赋值给 TreeList的DataSource,这个DataTable里面要有2列是必须的,因为这2列要赋给上面说的KeyFieldName和 ParentFieldName,先不说上面意思,树应该是从根节点递归、递归、一直往下递归到叶子,KeyFieldName和 ParentFieldName就起到这个作用,比如:下面的一个DataTable:
KeyFieldName | ParentFieldName | NodeName | NodeCode | Others |
1 | Null | 根节点1名称 | 根节点1编码 | 其他 |
2 | 1 | 节点1子节点名称 | 节点1子节点编码 | 其他 |
3 | 1 | 节点1子节点名称 | 节点1子节点编码 | 其他 |
4 | Null | 根节点4名称 | 根节点4编码 | 其他 |
5 | 4 | 节点4子节点名称 | 节点4子节点编码 | 其他 |
6 | 5 | 节点5子节点名称 | 节点5子节点编码 | 其他 |
这时,如果把这个DataTable赋给TreeList的话,就会产生下面的一棵树:
下面是一个构造TreeList的数据源的简单示例:
/// 构造一棵树型表结构
/// </summary>
/// <returns></returns>
private DataTable CreateTreeListTable()
{
DataTable dt = new DataTable();
DataColumn dcOID = new DataColumn("KeyFieldName", Type.GetType("System.Int32"));
DataColumn dcParentOID = new DataColumn("ParentFieldName", Type.GetType("System.Int32"));
DataColumn dcNodeName = new DataColumn("NodeName", Type.GetType("System.String"));
DataColumn dcNodeCode = new DataColumn("NodeCode", Type.GetType("System.String"));
DataColumn dcOthers = new DataColumn("Others", Type.GetType("System.String"));
dt.Columns.Add(dcOID);
dt.Columns.Add(dcParentOID);
dt.Columns.Add(dcNodeName);
dt.Columns.Add(dcNodeCode);
dt.Columns.Add(dcOthers);
//以上代码完成了DataTable的构架,但是里面是没有任何数据的
DataRow dr1 = dt.NewRow();
dr1["KeyFieldName"] = 1;
dr1["ParentFieldName"] = DBNull.Value;
dr1["NodeName"] = "根节点名称";
dr1["NodeCode"] = "根节点编码";
dr1["Others"] = "其他";
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2["KeyFieldName"] = 2;
dr2["ParentFieldName"] = 1;
dr2["NodeName"] = "节点子节点名称";
dr2["NodeCode"] = "节点子节点编码";
dr2["Others"] = "其他";
dt.Rows.Add(dr2);
DataRow dr3 = dt.NewRow();
dr3["KeyFieldName"] = 3;
dr3["ParentFieldName"] = 1;
dr3["NodeName"] = "节点子节点名称";
dr3["NodeCode"] = "节点子节点编码";
dr3["Others"] = "其他";
dt.Rows.Add(dr3);
DataRow dr4 = dt.NewRow();
dr4["KeyFieldName"] = 4;
dr4["ParentFieldName"] = DBNull.Value;
dr4["NodeName"] = "根节点名称";
dr4["NodeCode"] = "根节点编码";
dr4["Others"] = "其他";
dt.Rows.Add(dr4);
DataRow dr5 = dt.NewRow();
dr5["KeyFieldName"] = 5;
dr5["ParentFieldName"] = 4;
dr5["NodeName"] = "节点子节点名称";
dr5["NodeCode"] = "节点子节点编码";
dr5["Others"] = "其他";
dt.Rows.Add(dr5);
DataRow dr6 = dt.NewRow();
dr6["KeyFieldName"] = 6;
dr6["ParentFieldName"] = 5;
dr6["NodeName"] = "节点子节点名称";
dr6["NodeCode"] = "节点子节点编码";
dr6["Others"] = "其他";
dt.Rows.Add(dr6);
return dt;
}
好了,一个TreeList构造完成,下面就是TreeList的一些常用用法,都比较简单,这里就直接上代码了,代码中有简单的注释,大家一看就明白哦。
/// 点击节点前
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeLstModuleAction_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)
{
e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked);
}
/// <summary>
/// 点击节点后
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeLstModuleAction_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
{
SetCheckedChildNodes(e.Node, e.Node.CheckState);
SetCheckedParentNodes(e.Node, e.Node.CheckState);
}
/// <summary>
/// 选择子节点时触发
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
private void SetCheckedChildNodes(TreeListNode node, CheckState check)
{
for (int i = 0; i < node.Nodes.Count; i++)
{
node.Nodes[i].CheckState = check;
SetCheckedChildNodes(node.Nodes[i], check);
}
}
/// <summary>
/// 选择父节点时触发
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
private void SetCheckedParentNodes(TreeListNode node, CheckState check)
{
if (node.ParentNode != null)
{
bool b = false;
CheckState state;
for (int i = 0; i < node.ParentNode.Nodes.Count; i++)
{
state = (CheckState)node.ParentNode.Nodes[i].CheckState;
if (!check.Equals(state))
{
b = !b;
break;
}
}
node.ParentNode.CheckState = b ? CheckState.Indeterminate : check;
SetCheckedParentNodes(node.ParentNode, check);
}
}
/// <summary>
/// 判断此节点下的所有孩子节点是否选中
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
private Boolean IsChildsChecked(TreeListNode node)
{
for (int i = 0; i < node.Nodes.Count; i++)
{
if (node.Nodes[i].CheckState == CheckState.Unchecked)
return false;
if (node.Nodes[i].HasChildren)
IsChildsChecked(node.Nodes[i]);
}
return true;
}
好了,至此,关于TreeList的一些常用用法就说到这了,大家如果有好的想法,请不吝赐教,谢谢!
转载于:https://www.cnblogs.com/gaoxuzhao/archive/2011/10/14/2212125.html
Dev TreeList常用用法相关推荐
- RHEL7/CentOS7 ip 命令常用用法,代替 ifconfg/route/ifup/ifdown
注:从 RHEL7/CentOS7 开始,net-tools 包从系统中移除,ifconfg/route/ifup/ifdown 等命令均消失,转而以 ip 命令代替上述命令.因此本篇主要列举了如何使 ...
- 【Android 异步操作】Handler 机制 ( Handler 常用用法 | HandlerThread 简介 | HandlerThread 源码注释分析 )
文章目录 一.Handler 常用用法 二.HandlerThread 简介 三.HandlerThread 源码 一.Handler 常用用法 主线程 Handler 主要作用 : Looper 和 ...
- 【Android 异步操作】Timer 定时器 ( Timer 与 TimerTask 基本使用 | Timer 定时器常用用法 | Timer 源码分析 )
文章目录 一.Timer 定时器基本使用 二.Timer 定时器常用用法 三.Timer 源码分析 四.Timer 部分源码注释 五.源码及资源下载 参考文档 : Timer 定时器 API 文档 T ...
- 【Kotlin】Kotlin enum 枚举类 ( 常用用法 | 初始化成员变量 | 实现抽象方法 | 实现接口 | 获取名称和位置索引 | 调用枚举常量方法 )
文章目录 I . 枚举类常用用法 II . 枚举类初始化 III. 枚举类匿名类 IV . 枚举类实现接口 V . 获取枚举常量名称和位置索引 VI . 获取枚举常量的成员变量 VII . 调用枚举常 ...
- Dev控件用法 aspxTreeList 无刷新 aspxGridView 数据
Dev控件用法 aspxTreeList 无刷新 aspxGridView 数据 主要是利用 ASPxTreeList 点击事件回发服务器进行数据重新绑定 ASPxTreeList: ? 1 2 &l ...
- Python中的基本函数及其常用用法简析
分享Python中的基本函数及其常用用法简析,首先关于函数的解释函数是为了达到某种目的而采取的行为,函数是可重复使用的,用来实现某个单一功能或者功能片段的代码块,简单来说就是由一系列的程序语句组成的程 ...
- 【Data Mining】机器学习三剑客之Numpy常用用法总结
点击"小詹学Python",选择"置顶"公众号 重磅干货,第一时间送达 本文转载自AI蜗牛车,禁二次转载 一.前言 玩数据分析.数据挖掘.AI的都知道这个pyt ...
- grep参数说明及常用用法
grep参数说明及常用用法 查看文件内容 [kou@localhost ~]$ more size.txt b124230 b034325 a081016 m7187998 m7282064 a022 ...
- [转]ssh常用用法小结
ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...
最新文章
- 绝对巨星-罗伯特·巴乔
- 增加DIA进程的方法
- avcodec_send_packet()函数与avcodec_receive_frame()函数
- 手写一个简单的线程池MyThreadPool
- ShellSort 希尔排序
- VSCode 中,TS 提示 ”无法找到 *.vue 声明文件“ 的解决方案
- thymeleaf的初次使用(带参请求以及调用带参js方法)
- 1051: 平方根的和
- 【0x50 动态规划】Mobile Service【线性DP】
- css 实现一个尖角_请用CSS实现一个带尖角的正方形
- android拷机工具,如何科学理解麒麟9000的拷机功耗?
- js 秒转换成时分秒
- 笔记本新增一块1T固态,如何将系统迁移到新的固态,无缝对接(无需重装系统,迁移后直接用)。
- 《神秘的程序员们》年度抽奖活动 开奖了
- A - Vector-Sort,向量,排序
- 建站选择免费虚拟主机的六大误区
- setTimeout()的用法
- C# winform TreeView 屏蔽双击展开/折叠子节点
- 设置开机自动启动某软件
- 【喜讯】京品高科斩获2018阿里云生态合作伙伴解决方案大赛二等奖
热门文章
- [rsync] linux rsync 安装
- Android:四大架构的优缺点,你真的了解吗? 1
- Eclipse 启动项目错误:class not found
- [HDFS Manual] CH1 HDFS体系结构
- 理解C语言——从小菜到大神的晋级之路(1)——引言:C语言的前世今生
- Commons-logging + Log4j 使用方法、常见问题
- 14章类型信息之使用类字面常量
- jquery position
- Informix 9.4和CSDK的安装
- 《AlwaysRun!》第五次作业:项目需求分析改进与系统设计