DevExpress TreeList用法总结

工作中经常用的的是第三发控件 DevExpress ,相信大家都知道它的强大功能,这次用到了TreeList做了一个权限的管理,发现TreeList非常好用,大家可以看它自带的 Demo就知道了,功能很多,这里我就把我用到的说出来,大家一起交流学习。

  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的数据源的简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
///
 
/// 构造一棵树型表结构
 
///
 
///
 
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的一些常用用法,都比较简单,这里就直接上代码了,代码中有简单的注释,大家一看就明白哦。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
///
 
/// 点击节点前
 
///
 
///
 
///
 
private void treeLstModuleAction_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)
 
{
 
e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked);
 
}
 
///
 
/// 点击节点后
 
///
 
///
 
///
 
private void treeLstModuleAction_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
 
{
 
SetCheckedChildNodes(e.Node, e.Node.CheckState);
 
SetCheckedParentNodes(e.Node, e.Node.CheckState);
 
}
 
///
 
/// 选择子节点时触发
 
///
 
///
 
///
 
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);
 
}
 
}
 
///
 
/// 选择父节点时触发
 
///
 
///
 
///
 
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);
 
}
 
}
 
///
 
/// 判断此节点下的所有孩子节点是否选中
 
///
 
///
 
///
 
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的一些常用用法就说到这了,大家如果有好的想法,请不吝赐教,谢谢!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值