http://www.cnblogs.com/xxm/archive/2006/10/18/532009.html 写完一部分代码。都快要四点了。最近做项目,好久没有往博客上放东西了。趁着还有些精神,赶紧把上次没有发布的代码补上。使用treelist都有两个月了。发现自己使用它的tag属性达到了变态的地步,
http://www.cnblogs.com/xxm/archive/2006/10/18/532009.html
写完一部分代码。都快要四点了。最近做项目,好久没有往博客上放东西了。趁着还有些精神,赶紧把上次没有发布的代码补上。使用treelist都有两个月了。发现自己使用它的tag属性达到了变态的地步,在tag属性里放的struct里面的东西越来越多。在某种程度上。没有这个属性。我的好多工作是无法完成的。考虑到装箱和拆箱的过程,却也无可奈何。这是一个通过datatable来自动绑定treelist的类,考虑到了部分数据显示和部分字段显示,在每个simplebind的重载中都加入了这一部分的处理,强调一点。我所处理的数据都是以父子节点为基础的绑定。同时。子节点是以1开始。父节点是以 0开始。这样在存入父子节点id的时候要注意。代码如下,谨供自己和自己一样的菜鸟参考。
1using system.collections ;
2using system.data ;
3using businessentity;
4using persistencelayer;
5using devexpress.xtratreelist ;
6using devexpress.xtratreelist.nodes ;
7using devexpress.xtratreelist.columns ;
8namespace nskproject
9{
10 /**////
11 /// 一些实现或辅助绑定treelist的静态方法。
12 ///
13 public class bindtreelist
14 {
15 /**////
16 /// 初级绑定方法,给定的表中有父子关系的字字段,默认情况下表内所有字段都被绑定到控件内
17 ///
18 /// 数据源表
19 /// 需要绑定的控件
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 /**////
34 /// 初级绑定方法:在前一方法的基础上增加了将某一字段加入到tag属性中去。保存附加信息
35 /// 该表在赋值前以父节点为基础进行了排序
36 ///
37 /// 数据源表
38 /// 附加到tag属性中的字段
39 /// 需要绑定的控件
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 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 /**////
99 /// 针对有时候并不是加载一张表内的所有内容,对此加以变形,对于存在于表中不在列表内的字段
100 /// 给删除,对于不在表内而在列表内的值赋空值加入列表内
101 ///
102 /// 数据源表
103 /// 需要在treelist中显示的字段列表
104 /// 需要绑定的控件
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.id141 //可能存在只取一部分数据的情况,在这种情况下,取控件内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 /**////
164 ///
165 ///
166 ///
167 ///
168 ///
169 ///
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中的父子节点的列名。