









写完一部分代码。都快要四点了。最近做项目,好久没有往博客上放东西了。趁着还有些精神,赶紧把上次没有发布的代码补上。使用TreeList都有两个月了。发现自己使用它的Tag属性达到了变态的地步,在Tag属性里放的Struct里面的东西越来越多。在某种程度上。没有这个属性。我的好多工作是无法完成的。考虑到装箱和拆箱的过程,却也无可奈何。这是一个通过DataTable来自动绑定TreeList的类,考虑到了部分数据显示和部分字段显示,在每个SimpleBind的重载中都加入了这一部分的处理,强调一点。我所处理的数据都是以父子节点为基础的绑定。同时。子节点是以1开始。父节点是以0开始。这样在存入父子节点ID的时候要注意。代码如下,谨供自己和自己一样的菜鸟参考。
1
using System.Collections ;
2
using System.Data ;
3
using BusinessEntity;
4
using PersistenceLayer;
5
using DevExpress.XtraTreeList ;
6
using DevExpress.XtraTreeList.Nodes ;
7
using DevExpress.XtraTreeList.Columns ;
8
namespace NskProject
9
{
10
/// <summary>
11
/// 一些实现或辅助绑定TreeList的静态方法。
12
/// </summary>
13
public class BindTreeList
14
{
15
/// <summary>
16
/// 初级绑定方法,给定的表中有父子关系的字字段,默认情况下表内所有字段都被绑定到控件内
17
/// </summary>
18
/// <param name="Dt">数据源表</param>
19
/// <param name="Ti">需要绑定的控件</param>
20
public static void SimpleMode(DataTable Dt,TreeList Ti)
21
{
22
if(ParentFieldName==null && ChildFieldName==null)
23
{
24
return;
25
}
26
27
Ti.ParentFieldName=ParentFieldName;
28
Ti.KeyFieldName=ChildFieldName;
29
Ti.DataSource=Dt;
30
Ti.PopulateColumns();
31
return;
32
}
33
/// <summary>
34
/// 初级绑定方法:在前一方法的基础上增加了将某一字段加入到Tag属性中去。保存附加信息
35
/// 该表在赋值前以父节点为基础进行了排序
36
/// </summary>
37
/// <param name="Dt">数据源表</param>
38
/// <param name="TagColum">附加到Tag属性中的字段</param>
39
/// <param name="Ti">需要绑定的控件</param>
40
public static void SimpleMode(DataTable Dt,DataColumn TagColumn,TreeList Ti)
41
{
42
if(ParentFieldName==null && ChildFieldName==null)
43
{
44
return;
45
}
46
int TagColumnIndex=Dt.Columns.IndexOf(TagColumn);
47
foreach(DataRow dr in Dt.Rows)
48
{
49
object[] Data=new object[Dt.Columns.Count-3];
50
object Tag=new object() ;
51
Object[]Source=dr.ItemArray;
52
int count=0;
53
//显示数据与附加数据分离
54
for(int i=0;i<Source.Length;i++)
55
{
56
if(i!=TagColumnIndex &&i!=-1)
57
{
58
Data[count]=Source[count];
59
count++;
60
}
61
else
62
{
63
Tag=Source[i];
64
}
65
}
66
int ParentID=Convert.ToInt32(dr[ParentFieldName]);
67
int ChildID=Convert.ToInt32(dr[ChildFieldName]);
68
int Balance=0;
69
if(ParentID==0)
70
{
71
TreeListNode Node=Ti.AppendNode(Data,null);
72
Node.Tag=Tag;
73
if(Node.Id!=ChildID)
74
{
75
Balance=ChildID;
76
//可能存在只取一部分数据的情况,在这种情况下,取控件内ID与表内ID之间的差额
77
}
78
}
79
else
80
{
81
TreeListNode ParentNode;
82
if(Balance>0)//两种不同情况的取得父节点的方法
83
{
84
ParentNode=Ti.FindNodeByID(ParentID-Balance);
85
}
86
else
87
{
88
ParentNode=Ti.FindNodeByID(ParentID-1);
89
}
90
if(ParentNode!=null)
91
{
92
TreeListNode Node=Ti.AppendNode(Data,ParentNode);
93
Node.Tag=Tag;
94
}
95
}
96
}
97
}
98
/// <summary>
99
/// 针对有时候并不是加载一张表内的所有内容,对此加以变形,对于存在于表中不在列表内的字段
100
/// 给删除,对于不在表内而在列表内的值赋空值加入列表内
101
/// </summary>
102
/// <param name="Dt">数据源表</param>
103
/// <param name="FieldList">需要在TreeList中显示的字段列表</param>
104
/// <param name="Ti">需要绑定的控件</param>
105
public static void SimpleMode(DataTable Dt,string Fields,TreeList Ti)
106
{
107
Ti.Nodes.Clear();
108
int Balance=0;
109
string[] FieldList=Fields.Split(",".ToCharArray());
110
if(ParentFieldName==null && ChildFieldName==null)
111
{
112
return;
113
}
114
foreach(DataRow dr in Dt.Rows)
115
{
116
int index=0;
117
Object[] Data=new object[FieldList.Length];
118
foreach(string o in FieldList)
119
{
120
if(Dt.Columns.IndexOf(o)>-1)
121
{
122
string n=dr[o].ToString().Trim();
123
Data[index]=n;
124
}
125
else
126
{
127
Data[index]="";
128
}
129
index++;
130
}
131
132
int ParentID=Convert.ToInt32(dr[ParentFieldName]);
133
int ChildID=Convert.ToInt32(dr[ChildFieldName]);
134
135
if(ParentID==0)
136
{
137
TreeListNode Node=Ti.AppendNode(Data,null);
138
if(Node.Id!=ChildID-1)
139
{
140
Balance=Node.Id<ChildID?ChildID-Node.Id:Node.Id-ChildID;
141
//可能存在只取一部分数据的情况,在这种情况下,取控件内ID与表内ID之间的差额
142
}
143
}
144
else
145
{
146
TreeListNode ParentNode;
147
if(Balance>0)//两种不同情况的取得父节点的方法
148
{
149
ParentNode=Ti.FindNodeByID(ParentID-Balance);
150
}
151
else
152
{
153
ParentNode=Ti.FindNodeByID(ParentID-1);
154
}
155
if(ParentNode!=null)
156
{
157
TreeListNode Node=Ti.AppendNode(Data,ParentNode);
158
159
}
160
}
161
}
162
}
163
/// <summary>
164
///
165
/// </summary>
166
/// <param name="Dt"></param>
167
/// <param name="Fields"></param>
168
/// <param name="Ti"></param>
169
/// <param name="TagColumn"></param>
170
public static void SimpleMode(DataTable Dt,string Fields,TreeList Ti,string TagColumn)
171
{
172
Ti.Nodes.Clear();
173
int Balance=0;
174
string[] FieldList=Fields.Split(",".ToCharArray());
175
if(ParentFieldName==null && ChildFieldName==null)
176
{
177
return;
178
}
179
foreach(DataRow dr in Dt.Rows)
180
{
181
int index=0;
182
Object[] Data=new object[FieldList.Length];
183
foreach(string o in FieldList)
184
{
185
if(o!=TagColumn && Dt.Columns.IndexOf(o)>-1)
186
{
187
string n=dr[o].ToString().Trim();
188
Data[index]=n;
189
}
190
else
191
{
192
Data[index]="";
193
}
194
index++;
195
}
196
197
int ParentID=Convert.ToInt32(dr[ParentFieldName]);
198
int ChildID=Convert.ToInt32(dr[ChildFieldName]);
199
200
if(ParentID==0)
201
{
202
TreeListNode Node=Ti.AppendNode(Data,null);
203
Node.Tag =dr[TagColumn];
204
if(Node.Id!=ChildID)
205
{
206
Balance=ChildID;
207
//可能存在只取一部分数据的情况,在这种情况下,取控件内ID与表内ID之间的差额
208
}
209
}
210
else
211
{
212
TreeListNode ParentNode;
213
if(Balance>0)//两种不同情况的取得父节点的方法
214
{
215
ParentNode=Ti.FindNodeByID(ParentID-Balance);
216
}
217
else
218
{
219
ParentNode=Ti.FindNodeByID(ParentID-1);
220
}
221
if(ParentNode!=null)
222
{
223
TreeListNode Node=Ti.AppendNode(Data,ParentNode);
224
Node.Tag =dr[TagColumn];
225
226
}
227
}
228
}
229
}
230
private static string _ParentFieldName="";
231
private static string _ChildFieldName="";
232
public static string ParentFieldName
233
{
234
get{return _ParentFieldName;}
235
set{_ParentFieldName=value;}
236
}
237
238
public static string ChildFieldName
239
{
240
get{return _ChildFieldName;}
241
set{_ChildFieldName=value;}
242
}
243
244
}
245
}
246
这是一个静态方法,在执行SimpleBind方法前。必须对ChildFieldName和ParentFieldName进行赋值,它们对应着Dt中的父子节点的列名。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。