晨鸟科技
标题:
动态加载TreeView目录树之纠结篇
[打印本页]
作者:
Star
时间:
2010-8-2 19:51
标题:
动态加载TreeView目录树之纠结篇
今天比较郁闷的一件事情,就是用TreeView动态加载目录,从数据库中将目录读出来。
3 t# K% b# r% v) R1 Q( T* t( C% Y7 W
这个应该用动态规划比较简单,但是最近确实是用脑过度了,脑子里全是浆糊,就用下面要讲的死办法了~~==!
2 w, p, L, k- h2 ]) |% D
因为数据库设计的时候没有考虑到动态目录树的问题,没有在数据表中比较有前瞻性地设置上级编号、下级编号,只能将不同级别的目录内同一个一个找出来,我的这次,就用到了三张表,采用3重循环将数据添加到TreeNode中去:
step1:绑定节点数据
/ h. V. @$ D; m: Q" q
public TreeNode GetTreeNode()
) G1 V ^. e; @! R) I
{//这个函数还要做优化,因为这样写和数据库的交互会比较多,待有时间了再修改好了
, E4 O& q; G4 g; e0 w6 P. y2 z
int i = 0;
0 U y7 [' \/ ?( u8 [+ x% _
int n = 0;
4 k7 D/ h$ i* J6 ~* H% `
$ H8 Y# Y7 z2 k) H8 M/ ]
this.currentUserID = (int)Session[SessionStr.CurrentUserID];
6 `. X7 r0 |; V7 p
* n* Q/ e e: `: Z( b
TreeNode treeNode = new TreeNode();
( p2 c; K9 g. K' y" K+ N$ G
DataTable dtCourse = CourseManagementBL.GetCourseIDListByStudentUserID(this.currentUserID);
. e: ]& ^- l- L9 X* e
foreach (DataRow row in dtCourse.Rows)
. H0 W' h: }3 c
{
! Q! Z# G0 Z) Z( x
treeNode.ChildNodes.Add(new TreeNode(row[1].ToString()));
1 Y u! X! U% M, m( S
foreach (DataRow Experiment_row in ExperimentManagementBL.GetExperimentNameListByCourseID(int.Parse(row["courseID"].ToString())).Rows)
% H% W/ Q* R& @1 ^5 F
{
9 P: I& J5 M( o' W+ K: u y
TreeNode expNode = new TreeNode();
/ ?2 T; R' N; R# h/ s
expNode.Text = Experiment_row[1].ToString();
r9 \5 D% a5 }* r& R, h @ d
treeNode.ChildNodes[i].ChildNodes.Add(expNode);
/ O- |5 {- X, \( T) s% k5 s
) n7 u0 {% {* q$ a/ d) H( F
//treeNode.ChildNodes[i].ChildNodes.Add(new TreeNode(Experiment_row[1].ToString()));
( `. B6 v1 P. o! S8 I& l" [
foreach (DataRow Practice_row in PracticeManagementBL.GetPracticeIDListByExperimentID(int.Parse(Experiment_row["experimentID"].ToString())).Rows)
3 V; y: p: D! @* @2 R
{
f! |" L+ ~& c0 H# b. S& |9 ]
treeNode.ChildNodes[i].ChildNodes[n].ChildNodes.Add(new TreeNode(Practice_row[1].ToString()));
" x7 m( g0 v* ]3 L( w( Q
}
4 u' i, [2 A1 } ^6 t2 O9 R. a
n++;
7 t. O7 P4 v+ F& ^* L0 X! e
}
1 u4 R5 Q0 N; Z! {0 [, m0 T8 P
i++;
0 Q% z: H4 L ~4 ?4 E' X
- \. u& }' W/ n' h! v7 Q$ s+ |3 T
}
/ _% g4 O" Z- B6 J5 f! X, Q7 \9 q
return treeNode;
# W3 m8 ~! H' Z8 o5 F2 n7 q
}
* U* h, W- t' S+ D* N
复制代码
step2:将节点内容添加到TreeView中
U) p* [2 ~# K3 H. O, {/ J. D
也就是在这一步发现了TreeView中一个比较奇怪的东西,每将treeNode中一个节点Add到treeView中时,会自动地将treeNode的被添加的这个节点删掉(为什么为什么为什么???),这样就不能用foreach了,因为foreach只能读只读的数据
9 B% M. k, L' z' ~" l, m' O
[attach]72[/attach]
7 ` e# Z, I/ p( B5 `
那就直接Add整个treeNode吧(asp.net这个倒是挺自动化的),代码简单:
! G7 h0 c& s' k9 g7 H7 r
TreeNode tn = this.GetTreeNode();
# _7 H' q& c5 ~/ w" K
this.tvCourseMenu.Nodes.Add(tn);
$ g/ \4 d) x0 }5 G
问题也有,我用GetTreeNode函数返回的是一个TreeNode,是一个,所以生成的目录最上级是一个空的根目录(我在做数据绑定的时候没有绑定根目录的值啦,当然如果绑定了也可以没有下面的step3了),我想去掉这个,肯定不能Remove啦,因为Remove根目录,整个的都没啦。
% D0 M4 q3 c* C& H. O* M0 z
step3:
7 V/ j, k( V/ y# M
用循环绑定根目录的子目录
5 x# B, c. T: l* I1 G- r. k( n/ k
【不能这样】
6 u$ {5 `4 t, _2 g6 F: j% S. `
for (int i = 0; i < tn.ChildNodes.Count;)
: J' p* t* l) {* I2 J
{
5 H* T9 K) K0 X# _* I7 O
this.tvCourseMenu.Nodes.Add(tn.ChildNodes
);
7 K# k* h- g6 j- |& J& ^
}
. o" h9 z4 f# u2 V" X
【只能这样】
# h( e( d" R" S$ t; Q4 j
while (tn.ChildNodes.Count != 0)
4 [( h4 _* F+ L6 L& Q; y2 D
{
4 O# V( @ @' w" N5 l( s; M+ ?
this.tvCourseMenu.Nodes.Add(tn.ChildNodes[0]);
; B4 w) X" ~- s, q2 P
}
+ J& v; j* `' _
【理由】上面说了已经
: I. `$ ?# {# \. ?7 {' T
. ~" f' w+ _' ^5 L2 G; |( Q
终于弄好了,在做这个遇到step2中的问题的时候去请教了一个实验室的师兄,结果直接说,“我基本不用服务器控件的”,巨囧啊~~看来微软的这种控件还是有一些优化空间的啊,难怪不断地有VS05、08、10
欢迎光临 晨鸟科技 (http://www.chenniao.com/cprofessor/)
Powered by Discuz! X3.2