写完一部分代码。都快要四点了。最近做项目,好久没有往博客上放东西了。趁着还有些精神,赶紧把上次没有发布的代码补上。使用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中的父子节点的列名。
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 NskProject9
{10
/// <summary>11
/// 一些实现或辅助绑定TreeList的静态方法。12
/// </summary>13
public class BindTreeList14
{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
else62
{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
else80
{81
TreeListNode ParentNode;82
if(Balance>0)//两种不同情况的取得父节点的方法83
{84
ParentNode=Ti.FindNodeByID(ParentID-Balance);85
}86
else87
{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
else126
{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
else145
{146
TreeListNode ParentNode;147
if(Balance>0)//两种不同情况的取得父节点的方法148
{149
ParentNode=Ti.FindNodeByID(ParentID-Balance);150
}151
else152
{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
else191
{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
else211
{212
TreeListNode ParentNode;213
if(Balance>0)//两种不同情况的取得父节点的方法214
{215
ParentNode=Ti.FindNodeByID(ParentID-Balance);216
}217
else218
{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 ParentFieldName233
{234
get{return _ParentFieldName;}235
set{_ParentFieldName=value;}236
}237

238
public static string ChildFieldName239
{240
get{return _ChildFieldName;}241
set{_ChildFieldName=value;}242
}243
244
}245
}246



浙公网安备 33010602011771号