工作中经常用的的是第三发控件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>

/// 构造一棵树型表结构

/// </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>

/// 点击节点前

/// </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常用用法相关推荐

  1. RHEL7/CentOS7 ip 命令常用用法,代替 ifconfg/route/ifup/ifdown

    注:从 RHEL7/CentOS7 开始,net-tools 包从系统中移除,ifconfg/route/ifup/ifdown 等命令均消失,转而以 ip 命令代替上述命令.因此本篇主要列举了如何使 ...

  2. 【Android 异步操作】Handler 机制 ( Handler 常用用法 | HandlerThread 简介 | HandlerThread 源码注释分析 )

    文章目录 一.Handler 常用用法 二.HandlerThread 简介 三.HandlerThread 源码 一.Handler 常用用法 主线程 Handler 主要作用 : Looper 和 ...

  3. 【Android 异步操作】Timer 定时器 ( Timer 与 TimerTask 基本使用 | Timer 定时器常用用法 | Timer 源码分析 )

    文章目录 一.Timer 定时器基本使用 二.Timer 定时器常用用法 三.Timer 源码分析 四.Timer 部分源码注释 五.源码及资源下载 参考文档 : Timer 定时器 API 文档 T ...

  4. 【Kotlin】Kotlin enum 枚举类 ( 常用用法 | 初始化成员变量 | 实现抽象方法 | 实现接口 | 获取名称和位置索引 | 调用枚举常量方法 )

    文章目录 I . 枚举类常用用法 II . 枚举类初始化 III. 枚举类匿名类 IV . 枚举类实现接口 V . 获取枚举常量名称和位置索引 VI . 获取枚举常量的成员变量 VII . 调用枚举常 ...

  5. Dev控件用法 aspxTreeList 无刷新 aspxGridView 数据

    Dev控件用法 aspxTreeList 无刷新 aspxGridView 数据 主要是利用 ASPxTreeList 点击事件回发服务器进行数据重新绑定 ASPxTreeList: ? 1 2 &l ...

  6. Python中的基本函数及其常用用法简析

    分享Python中的基本函数及其常用用法简析,首先关于函数的解释函数是为了达到某种目的而采取的行为,函数是可重复使用的,用来实现某个单一功能或者功能片段的代码块,简单来说就是由一系列的程序语句组成的程 ...

  7. 【Data Mining】机器学习三剑客之Numpy常用用法总结

    点击"小詹学Python",选择"置顶"公众号 重磅干货,第一时间送达 本文转载自AI蜗牛车,禁二次转载 一.前言 玩数据分析.数据挖掘.AI的都知道这个pyt ...

  8. grep参数说明及常用用法

    grep参数说明及常用用法 查看文件内容 [kou@localhost ~]$ more size.txt b124230 b034325 a081016 m7187998 m7282064 a022 ...

  9. [转]ssh常用用法小结

    ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...

最新文章

  1. 绝对巨星-罗伯特·巴乔
  2. 增加DIA进程的方法
  3. avcodec_send_packet()函数与avcodec_receive_frame()函数
  4. 手写一个简单的线程池MyThreadPool
  5. ShellSort 希尔排序
  6. VSCode 中,TS 提示 ”无法找到 *.vue 声明文件“ 的解决方案
  7. thymeleaf的初次使用(带参请求以及调用带参js方法)
  8. 1051: 平方根的和
  9. 【0x50 动态规划】Mobile Service【线性DP】
  10. css 实现一个尖角_请用CSS实现一个带尖角的正方形
  11. android拷机工具,如何科学理解麒麟9000的拷机功耗?
  12. js 秒转换成时分秒
  13. 笔记本新增一块1T固态,如何将系统迁移到新的固态,无缝对接(无需重装系统,迁移后直接用)。
  14. 《神秘的程序员们》年度抽奖活动 开奖了
  15. A - Vector-Sort,向量,排序
  16. 建站选择免费虚拟主机的六大误区
  17. setTimeout()的用法
  18. C# winform TreeView 屏蔽双击展开/折叠子节点
  19. 设置开机自动启动某软件
  20. 【喜讯】京品高科斩获2018阿里云生态合作伙伴解决方案大赛二等奖

热门文章

  1. [rsync] linux rsync 安装
  2. Android:四大架构的优缺点,你真的了解吗? 1
  3. Eclipse 启动项目错误:class not found
  4. [HDFS Manual] CH1 HDFS体系结构
  5. 理解C语言——从小菜到大神的晋级之路(1)——引言:C语言的前世今生
  6. Commons-logging + Log4j 使用方法、常见问题
  7. 14章类型信息之使用类字面常量
  8. jquery position
  9. Informix 9.4和CSDK的安装
  10. 《AlwaysRun!》第五次作业:项目需求分析改进与系统设计