开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 14115|回复: 6

Dev TreeList常用用法-转贴

[复制链接]

0

精华

6

贡献

225

赞扬

帖子
71
软币
1999
在线时间
134 小时
注册时间
2013-6-9
发表于 2013-6-13 23:00:48 | 显示全部楼层 |阅读模式
本帖最后由 sinomac 于 2013-6-14 23:12 编辑

工作中经常用的的是第三发控件Developer Express,相信大家都知道它的强大功能,这次用到了TreeList做了一个权限的管理,发现TreeList非常好用,大家可以看它自带的 Demo就知道了,功能很多,这里我就把我用到的说出来,大家一起交流学习。
TreeList有一个KeyFieldNameParentFieldName,这2个非常重要,只要构造一个DataTable赋值给 TreeListDataSource,这个DataTable里面要有2列是必须的,因为这2列要赋给上面说的KeyFieldNameParentFieldName,先不说上面意思,树应该是从根节点递归、递归、一直往下递归到叶子,KeyFieldNameParentFieldName就起到这个作用,比如:下面的一个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的话,就会产生下面的一棵树:
111.jpg
下面是一个构造TreeList的数据源的简单示例:
代码
  1. /// <summary>

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

  3. /// </summary>

  4. /// <returns></returns>

  5. private DataTable CreateTreeListTable()

  6. {

  7. DataTable dt = new DataTable();

  8. DataColumn dcOID = new DataColumn("KeyFieldName", Type.GetType("System.Int32"));

  9. DataColumn dcParentOID = new DataColumn("ParentFieldName", Type.GetType("System.Int32"));

  10. DataColumn dcNodeName = new DataColumn("NodeName", Type.GetType("System.String"));

  11. DataColumn dcNodeCode = new DataColumn("NodeCode", Type.GetType("System.String"));

  12. DataColumn dcOthers = new DataColumn("Others", Type.GetType("System.String"));

  13. dt.Columns.Add(dcOID);

  14. dt.Columns.Add(dcParentOID);

  15. dt.Columns.Add(dcNodeName);

  16. dt.Columns.Add(dcNodeCode);

  17. dt.Columns.Add(dcOthers);

  18. //以上代码完成了DataTable的构架,但是里面是没有任何数据的

  19. DataRow dr1 = dt.NewRow();

  20. dr1["KeyFieldName"] = 1;

  21. dr1["ParentFieldName"] = DBNull.Value;

  22. dr1["NodeName"] = "根节点名称";

  23. dr1["NodeCode"] = "根节点编码";

  24. dr1["Others"] = "其他";

  25. dt.Rows.Add(dr1);

  26. DataRow dr2 = dt.NewRow();

  27. dr2["KeyFieldName"] = 2;

  28. dr2["ParentFieldName"] = 1;

  29. dr2["NodeName"] = "节点子节点名称";

  30. dr2["NodeCode"] = "节点子节点编码";

  31. dr2["Others"] = "其他";

  32. dt.Rows.Add(dr2);

  33. DataRow dr3 = dt.NewRow();

  34. dr3["KeyFieldName"] = 3;

  35. dr3["ParentFieldName"] = 1;

  36. dr3["NodeName"] = "节点子节点名称";

  37. dr3["NodeCode"] = "节点子节点编码";

  38. dr3["Others"] = "其他";

  39. dt.Rows.Add(dr3);

  40. DataRow dr4 = dt.NewRow();

  41. dr4["KeyFieldName"] = 4;

  42. dr4["ParentFieldName"] = DBNull.Value;

  43. dr4["NodeName"] = "根节点名称";

  44. dr4["NodeCode"] = "根节点编码";

  45. dr4["Others"] = "其他";

  46. dt.Rows.Add(dr4);

  47. DataRow dr5 = dt.NewRow();

  48. dr5["KeyFieldName"] = 5;

  49. dr5["ParentFieldName"] = 4;

  50. dr5["NodeName"] = "节点子节点名称";

  51. dr5["NodeCode"] = "节点子节点编码";

  52. dr5["Others"] = "其他";

  53. dt.Rows.Add(dr5);

  54. DataRow dr6 = dt.NewRow();

  55. dr6["KeyFieldName"] = 6;

  56. dr6["ParentFieldName"] = 5;

  57. dr6["NodeName"] = "节点子节点名称";

  58. dr6["NodeCode"] = "节点子节点编码";

  59. dr6["Others"] = "其他";

  60. dt.Rows.Add(dr6);

  61. return dt;

  62. }
复制代码

好了,一个TreeList构造完成,下面就是TreeList的一些常用用法,都比较简单,这里就直接上代码了,代码中有简单的注释,大家一看就明白哦。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps_clip_image-1953.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps_clip_image-966.png代码
  1. /// <summary>

  2. /// 点击节点前

  3. /// </summary>

  4. /// <param name="sender"></param>

  5. /// <param name="e"></param>

  6. private void treeLstModuleAction_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)

  7. {

  8. e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked);

  9. }

  10. /// <summary>

  11. /// 点击节点后

  12. /// </summary>

  13. /// <param name="sender"></param>

  14. /// <param name="e"></param>

  15. private void treeLstModuleAction_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)

  16. {

  17. SetCheckedChildNodes(e.Node, e.Node.CheckState);

  18. SetCheckedParentNodes(e.Node, e.Node.CheckState);

  19. }

  20. /// <summary>

  21. /// 选择子节点时触发

  22. /// </summary>

  23. /// <param name="node"></param>

  24. /// <param name="check"></param>

  25. private void SetCheckedChildNodes(TreeListNode node, CheckState check)

  26. {

  27. for (int i = 0; i < node.Nodes.Count; i++)

  28. {

  29. node.Nodes.CheckState = check;

  30. SetCheckedChildNodes(node.Nodes, check);

  31. }

  32. }

  33. /// <summary>

  34. /// 选择父节点时触发

  35. /// </summary>

  36. /// <param name="node"></param>

  37. /// <param name="check"></param>

  38. private void SetCheckedParentNodes(TreeListNode node, CheckState check)

  39. {

  40. if (node.ParentNode != null)

  41. {

  42. bool b = false;

  43. CheckState state;

  44. for (int i = 0; i < node.ParentNode.Nodes.Count; i++)

  45. {

  46. state = (CheckState)node.ParentNode.Nodes.CheckState;

  47. if (!check.Equals(state))

  48. {

  49. b = !b;

  50. break;

  51. }

  52. }

  53. node.ParentNode.CheckState = b ? CheckState.Indeterminate : check;

  54. SetCheckedParentNodes(node.ParentNode, check);

  55. }

  56. }

  57. /// <summary>

  58. /// 判断此节点下的所有孩子节点是否选中

  59. /// </summary>

  60. /// <param name="node"></param>

  61. /// <returns></returns>

  62. private Boolean IsChildsChecked(TreeListNode node)

  63. {

  64. for (int i = 0; i < node.Nodes.Count; i++)

  65. {

  66. if (node.Nodes.CheckState == CheckState.Unchecked)

  67. return false;

  68. if (node.Nodes.HasChildren)

  69. IsChildsChecked(node.Nodes);

  70. }

  71. return true;

  72. }
复制代码

评分

参与人数 2赞扬 +2 收起 理由
cgc20xin + 1 很给力
DaisyNet + 1 赞一个

查看全部评分

回复

使用道具 举报

0

精华

0

贡献

60

赞扬

帖子
138
软币
2531
在线时间
317 小时
注册时间
2013-6-8
发表于 2013-6-14 03:18:39 | 显示全部楼层
thnks bro  ....
回复

使用道具 举报

0

精华

174

贡献

356

赞扬

管理员

帖子
35
软币
2106
在线时间
338 小时
注册时间
2013-6-7
发表于 2013-6-14 08:37:14 | 显示全部楼层
很好的教程,感谢楼主分享。
小提示:如果帖子里包含代码可以使用编辑器的 [插入代码] 功能,这样可增加代码的可阅读性,而且不会出现文字莫名其妙的变粗变斜的情况。
回复

使用道具 举报

0

精华

0

贡献

15

赞扬

帖子
20
软币
270
在线时间
19 小时
注册时间
2013-6-16
发表于 2013-6-16 10:53:06 | 显示全部楼层
good,this object let me in trouble for a long time.
回复

使用道具 举报

0

精华

830

贡献

159

赞扬

正版授权组

Rank: 14Rank: 14Rank: 14Rank: 14

帖子
238
软币
2694
在线时间
264 小时
注册时间
2013-6-17
发表于 2013-6-18 10:18:45 | 显示全部楼层
收藏收藏,我一直纠结的就是这个treelist和自带的tree
回复

使用道具 举报

0

精华

121

贡献

86

赞扬

帖子
80
软币
3632
在线时间
271 小时
注册时间
2013-6-8
发表于 2013-6-19 09:19:27 | 显示全部楼层
最近正在使用Treelist控件,谢谢了。
回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-3-29 23:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表