晨鸟科技
标题:
动态加载TreeView目录树之纠结篇
[打印本页]
作者:
Star
时间:
2010-8-2 19:51
标题:
动态加载TreeView目录树之纠结篇
今天比较郁闷的一件事情,就是用TreeView动态加载目录,从数据库中将目录读出来。
5 V3 `" v4 H* N4 q
这个应该用动态规划比较简单,但是最近确实是用脑过度了,脑子里全是浆糊,就用下面要讲的死办法了~~==!
+ n1 O H ?5 _5 H+ w* D/ |' f$ t
因为数据库设计的时候没有考虑到动态目录树的问题,没有在数据表中比较有前瞻性地设置上级编号、下级编号,只能将不同级别的目录内同一个一个找出来,我的这次,就用到了三张表,采用3重循环将数据添加到TreeNode中去:
step1:绑定节点数据
' u% M1 r+ [! p }. j5 d1 B# P+ ~
public TreeNode GetTreeNode()
1 q R$ `/ w% z8 E) y
{//这个函数还要做优化,因为这样写和数据库的交互会比较多,待有时间了再修改好了
; ~( J. t) y- B% C4 l6 C6 I6 `8 n
int i = 0;
, r" \2 G' x/ T, K
int n = 0;
- b9 X+ n4 \8 H
0 k* V. W$ y8 Z
this.currentUserID = (int)Session[SessionStr.CurrentUserID];
& Z% w' ?1 b8 L; A: R3 Q$ b5 Z
4 r: p* f6 k7 z' n6 S6 X1 p
TreeNode treeNode = new TreeNode();
% c# v9 q( X( a& o7 I
DataTable dtCourse = CourseManagementBL.GetCourseIDListByStudentUserID(this.currentUserID);
5 ]; l$ w: }$ b# o3 k) F6 @
foreach (DataRow row in dtCourse.Rows)
( G& L* j, r1 d2 e# W! R; R
{
8 F& f* Y/ T4 X: f! C& j
treeNode.ChildNodes.Add(new TreeNode(row[1].ToString()));
2 l; G8 C5 O1 ^
foreach (DataRow Experiment_row in ExperimentManagementBL.GetExperimentNameListByCourseID(int.Parse(row["courseID"].ToString())).Rows)
' K9 |5 [# {# t, ^9 p! W& W
{
/ L8 y* x+ F, h4 L5 {) Y
TreeNode expNode = new TreeNode();
' c6 C3 M4 f0 Z' p# G$ A1 y
expNode.Text = Experiment_row[1].ToString();
1 U, @# l* _! ?! y5 k3 ^( z4 O6 V
treeNode.ChildNodes[i].ChildNodes.Add(expNode);
% c) V5 P0 G6 P1 N0 v* E, ]1 L, U
% \4 C) o9 ?! [% }
//treeNode.ChildNodes[i].ChildNodes.Add(new TreeNode(Experiment_row[1].ToString()));
1 a. k8 t$ s' z! ~$ X) i4 d
foreach (DataRow Practice_row in PracticeManagementBL.GetPracticeIDListByExperimentID(int.Parse(Experiment_row["experimentID"].ToString())).Rows)
) t# k1 Q8 A# j1 r: Z
{
, ~ j) g# O; K" w) Y$ r
treeNode.ChildNodes[i].ChildNodes[n].ChildNodes.Add(new TreeNode(Practice_row[1].ToString()));
+ f) x7 j! G! c0 k6 z
}
$ m. d0 R# m* \% @3 S
n++;
7 l) v6 X3 q' ?$ X: A0 j
}
$ e5 |8 x$ A3 h. @: V( P2 x
i++;
0 ]/ Q+ X5 M& K! t
( _5 u# _# ?2 p O% J* W- f
}
G: P5 t% l1 S8 J
return treeNode;
( N# \$ B7 s' K9 O B# f1 |/ \1 |
}
% `/ N' U) W* \( C
复制代码
step2:将节点内容添加到TreeView中
& r) O* S5 Q* U0 e: Y. Z0 R
也就是在这一步发现了TreeView中一个比较奇怪的东西,每将treeNode中一个节点Add到treeView中时,会自动地将treeNode的被添加的这个节点删掉(为什么为什么为什么???),这样就不能用foreach了,因为foreach只能读只读的数据
$ }9 K9 R q1 `) o7 H
[attach]72[/attach]
5 a+ L& ]4 \- |
那就直接Add整个treeNode吧(asp.net这个倒是挺自动化的),代码简单:
( h2 t: g; N# [, v1 J* T B
TreeNode tn = this.GetTreeNode();
* d7 \+ I! [+ L' ?
this.tvCourseMenu.Nodes.Add(tn);
3 r) L" D/ N# ~* g5 @7 a5 H4 Q! L
问题也有,我用GetTreeNode函数返回的是一个TreeNode,是一个,所以生成的目录最上级是一个空的根目录(我在做数据绑定的时候没有绑定根目录的值啦,当然如果绑定了也可以没有下面的step3了),我想去掉这个,肯定不能Remove啦,因为Remove根目录,整个的都没啦。
9 a/ _/ l- ^/ N; y8 v
step3:
7 H4 N5 A1 t* c3 u0 j& B* C* z
用循环绑定根目录的子目录
, _$ }/ |# U( W# K' n$ _
【不能这样】
% f2 A4 {' a0 s, S0 R- E/ ?' D
for (int i = 0; i < tn.ChildNodes.Count;)
/ \: w) N* V0 i( A
{
: M2 R) R: p% x3 }' J6 g
this.tvCourseMenu.Nodes.Add(tn.ChildNodes
);
7 c* M& f. v' `. Y. ?! l G9 `! i; N" a
}
% _+ Z8 v; C$ ]- H6 i
【只能这样】
/ Z+ x | d2 w) e3 R0 B# X" l
while (tn.ChildNodes.Count != 0)
. F* D, {3 p2 b' S5 a" y% G: A
{
3 r$ z3 r' ?: ? Q( u% V: y
this.tvCourseMenu.Nodes.Add(tn.ChildNodes[0]);
i" t" N! M0 a$ H
}
7 w& z4 d' ] i2 O- h
【理由】上面说了已经
; ?2 O/ }# f$ i* T2 b, T& e
0 f7 P8 W/ \! A7 X" q$ A8 S
终于弄好了,在做这个遇到step2中的问题的时候去请教了一个实验室的师兄,结果直接说,“我基本不用服务器控件的”,巨囧啊~~看来微软的这种控件还是有一些优化空间的啊,难怪不断地有VS05、08、10
欢迎光临 晨鸟科技 (http://www.chenniao.com/cprofessor/)
Powered by Discuz! X3.2