今天比较郁闷的一件事情,就是用TreeView动态加载目录,从数据库中将目录读出来。
K1 n5 W8 v* z5 x+ S这个应该用动态规划比较简单,但是最近确实是用脑过度了,脑子里全是浆糊,就用下面要讲的死办法了~~==!
$ u+ F* i0 u: I, p* k因为数据库设计的时候没有考虑到动态目录树的问题,没有在数据表中比较有前瞻性地设置上级编号、下级编号,只能将不同级别的目录内同一个一个找出来,我的这次,就用到了三张表,采用3重循环将数据添加到TreeNode中去:- step1:绑定节点数据 m% }7 H- E' G! j2 S! N6 b
- public TreeNode GetTreeNode()
- W2 O0 m* p+ _/ i4 z - {//这个函数还要做优化,因为这样写和数据库的交互会比较多,待有时间了再修改好了
. S3 y; r' [3 w) T$ f: G - int i = 0;; M+ |" K) g4 {$ U$ C0 n
- int n = 0;: K6 v: Y: `/ ]
* O! _4 }% I* T7 [8 ^; w- this.currentUserID = (int)Session[SessionStr.CurrentUserID];$ p7 Y$ L/ r& o8 @9 ^0 d
- * s4 n& z- r& d, S( i% s0 W5 G
- TreeNode treeNode = new TreeNode();
# B, [! x/ r* ~1 }' |4 t! h+ ~, H - DataTable dtCourse = CourseManagementBL.GetCourseIDListByStudentUserID(this.currentUserID);
0 U0 |) W5 |. N9 O - foreach (DataRow row in dtCourse.Rows)1 l& B: w5 }. u9 d; z
- {
* \+ L) S& ~% K+ p3 A; C - treeNode.ChildNodes.Add(new TreeNode(row[1].ToString()));7 h8 ^7 e7 D) v9 q
- foreach (DataRow Experiment_row in ExperimentManagementBL.GetExperimentNameListByCourseID(int.Parse(row["courseID"].ToString())).Rows)
, V2 f f; S3 F - {) C1 S! p. y2 B% }6 C5 T3 b
- TreeNode expNode = new TreeNode();
* n! g! a1 B9 g/ P2 z4 f; F - expNode.Text = Experiment_row[1].ToString(); b$ j% B9 U) H/ }& L. O
- treeNode.ChildNodes[i].ChildNodes.Add(expNode);$ H( B" {% s2 G! | U- _) x
1 J2 F0 \; o5 l) o0 ]$ t8 y* {# s5 i- //treeNode.ChildNodes[i].ChildNodes.Add(new TreeNode(Experiment_row[1].ToString()));! p3 P& Q& R- t
- foreach (DataRow Practice_row in PracticeManagementBL.GetPracticeIDListByExperimentID(int.Parse(Experiment_row["experimentID"].ToString())).Rows)4 N: n, {9 e& Q. h9 E) x: b: B' M
- {2 C: A0 w! [3 _. f: k' H7 ^
- treeNode.ChildNodes[i].ChildNodes[n].ChildNodes.Add(new TreeNode(Practice_row[1].ToString()));
; @0 F5 B6 F3 R4 p: P f( h - }
- x8 l* z! _, F/ B& ^, M - n++;& m# y1 L- E' x( }$ h
- }, _/ C/ y. r+ u0 E! P) I' x2 N
- i++;# C( t# N" H# v4 h
-
$ V' j) D9 Y) O9 p - }
( {, s' B- i+ G& X. @9 y - return treeNode;# J d8 G* K" w+ p' L c
- }
7 t5 a% w, I' J. S. J4 ?2 X% p: W
复制代码 step2:将节点内容添加到TreeView中) r4 d& C' H" {, B* `
也就是在这一步发现了TreeView中一个比较奇怪的东西,每将treeNode中一个节点Add到treeView中时,会自动地将treeNode的被添加的这个节点删掉(为什么为什么为什么???),这样就不能用foreach了,因为foreach只能读只读的数据
* d6 I5 G7 ^! `9 q7 C8 B. }' Z
! e% M1 f0 n- |" j那就直接Add整个treeNode吧(asp.net这个倒是挺自动化的),代码简单:
# H7 G" y/ R$ ~/ I4 B z9 W$ qTreeNode tn = this.GetTreeNode();( m5 S' h C: k9 R
this.tvCourseMenu.Nodes.Add(tn);
3 W) x2 e1 t1 I0 x* l问题也有,我用GetTreeNode函数返回的是一个TreeNode,是一个,所以生成的目录最上级是一个空的根目录(我在做数据绑定的时候没有绑定根目录的值啦,当然如果绑定了也可以没有下面的step3了),我想去掉这个,肯定不能Remove啦,因为Remove根目录,整个的都没啦。1 B0 q' B6 g% N! v5 v! `+ M
step3:3 |% ?: Z* G9 m: C
用循环绑定根目录的子目录
% {9 W6 ?0 s& q O+ B【不能这样】
0 `; @+ v3 D! Sfor (int i = 0; i < tn.ChildNodes.Count;)# \7 `/ g z8 B2 T- E
{) o8 `$ Z. \# m
this.tvCourseMenu.Nodes.Add(tn.ChildNodes);
9 \( ]1 Z, A5 |. H$ @! |( ^ }
6 h$ I& j) G' S【只能这样】" V5 J0 ]3 F: L7 m% ~' H" J
while (tn.ChildNodes.Count != 0)
X0 }; s& i6 g9 G/ y) w: Z: ^ {3 e" I4 j0 c$ l* G1 K7 \. r
this.tvCourseMenu.Nodes.Add(tn.ChildNodes[0]);
& W' F0 r& E6 J* ] }
0 @) x: b. a% v; c+ L+ W【理由】上面说了已经
1 p# ?4 i3 i1 p- p9 y% V5 t8 M& _4 ~( K% v9 q
终于弄好了,在做这个遇到step2中的问题的时候去请教了一个实验室的师兄,结果直接说,“我基本不用服务器控件的”,巨囧啊~~看来微软的这种控件还是有一些优化空间的啊,难怪不断地有VS05、08、10 |