晨鸟科技
标题:
动态加载TreeView目录树之纠结篇
[打印本页]
作者:
Star
时间:
2010-8-2 19:51
标题:
动态加载TreeView目录树之纠结篇
今天比较郁闷的一件事情,就是用TreeView动态加载目录,从数据库中将目录读出来。
( |1 N0 K3 p. Z* p9 y
这个应该用动态规划比较简单,但是最近确实是用脑过度了,脑子里全是浆糊,就用下面要讲的死办法了~~==!
" a! D) f5 {$ O1 A
因为数据库设计的时候没有考虑到动态目录树的问题,没有在数据表中比较有前瞻性地设置上级编号、下级编号,只能将不同级别的目录内同一个一个找出来,我的这次,就用到了三张表,采用3重循环将数据添加到TreeNode中去:
step1:绑定节点数据
6 X- Z V$ C( c4 y! T
public TreeNode GetTreeNode()
. g5 a# z: p; L
{//这个函数还要做优化,因为这样写和数据库的交互会比较多,待有时间了再修改好了
4 s: ^0 `* f& p; o4 Z A) {
int i = 0;
+ F# |8 m6 C1 a) V& U* W
int n = 0;
; p$ j' d% e8 I7 K
) f1 e7 \2 W8 Q5 `, P1 D& R
this.currentUserID = (int)Session[SessionStr.CurrentUserID];
! }: E, G7 S! q" G
7 D- O! R5 C* b
TreeNode treeNode = new TreeNode();
* U0 i( `4 R8 g2 {' f' @8 u1 m! f" j
DataTable dtCourse = CourseManagementBL.GetCourseIDListByStudentUserID(this.currentUserID);
" u X! H) [7 a/ V, ?
foreach (DataRow row in dtCourse.Rows)
9 C' y! A+ ?5 D9 L* y
{
" [, Q6 I7 @0 E" x: M' Z, |2 F4 @- t
treeNode.ChildNodes.Add(new TreeNode(row[1].ToString()));
6 G- J5 d2 R- A* j1 R4 V, I
foreach (DataRow Experiment_row in ExperimentManagementBL.GetExperimentNameListByCourseID(int.Parse(row["courseID"].ToString())).Rows)
4 S3 {& X% t# B- R2 w
{
2 ]! Q6 ]* }: }2 p9 j$ v2 ~
TreeNode expNode = new TreeNode();
% R- x( X0 Z' s: ?. T: W: H- F3 z3 }
expNode.Text = Experiment_row[1].ToString();
" G% K2 f6 v/ X" l
treeNode.ChildNodes[i].ChildNodes.Add(expNode);
9 g5 x/ v3 X0 K( A" J9 I
# E/ I! |$ c5 M- Y% Q
//treeNode.ChildNodes[i].ChildNodes.Add(new TreeNode(Experiment_row[1].ToString()));
' Z6 \$ r- ?% c5 O+ f% q1 ^
foreach (DataRow Practice_row in PracticeManagementBL.GetPracticeIDListByExperimentID(int.Parse(Experiment_row["experimentID"].ToString())).Rows)
* S6 W% F# E: Z2 {/ l! B
{
& s: S. @$ s6 |6 a4 u
treeNode.ChildNodes[i].ChildNodes[n].ChildNodes.Add(new TreeNode(Practice_row[1].ToString()));
. T7 q6 Y& w. p
}
. F$ d; w3 u+ w: x1 }+ M4 }7 u
n++;
7 m- D# x& U! r& t2 Z# [, S% \# ^
}
, ]: } v% X+ B6 I0 o! h
i++;
s& P4 b9 A# K0 l4 ]4 M( x5 U b
2 R) s9 Y1 o6 o/ ~: t: c9 r
}
( A2 ~) _, W: [4 f$ n! l' M
return treeNode;
: O8 }' A8 q, ?
}
9 A b: G% N! z& H6 ?: u
复制代码
step2:将节点内容添加到TreeView中
" {/ a6 \+ J3 F% U: z* @1 b
也就是在这一步发现了TreeView中一个比较奇怪的东西,每将treeNode中一个节点Add到treeView中时,会自动地将treeNode的被添加的这个节点删掉(为什么为什么为什么???),这样就不能用foreach了,因为foreach只能读只读的数据
8 V {8 J" y8 G3 i3 ^* }
[attach]72[/attach]
+ J; N* p$ x- J/ E5 @, b% y7 t; [8 _
那就直接Add整个treeNode吧(asp.net这个倒是挺自动化的),代码简单:
1 N: N3 i$ L' d% h! X
TreeNode tn = this.GetTreeNode();
+ D: e% l: k9 m) d3 Q
this.tvCourseMenu.Nodes.Add(tn);
6 I5 n% S* f; H
问题也有,我用GetTreeNode函数返回的是一个TreeNode,是一个,所以生成的目录最上级是一个空的根目录(我在做数据绑定的时候没有绑定根目录的值啦,当然如果绑定了也可以没有下面的step3了),我想去掉这个,肯定不能Remove啦,因为Remove根目录,整个的都没啦。
/ |! r4 R5 E" q# D* z* f0 }- Y
step3:
% g% o" @1 a0 _% w' o4 v3 A2 U
用循环绑定根目录的子目录
; g" y6 w/ V! L" H& _! [
【不能这样】
. `$ c! @5 u! Q2 S% _
for (int i = 0; i < tn.ChildNodes.Count;)
. O8 l' X$ d. X
{
/ R, Z7 {) @$ \' U, I; d+ u' e
this.tvCourseMenu.Nodes.Add(tn.ChildNodes
);
- x# ^ H$ @3 R/ F$ A) @9 t
}
% ~5 T; \! V$ a& m6 b( Y4 r1 t
【只能这样】
7 _8 w4 t: T, z8 \& ?
while (tn.ChildNodes.Count != 0)
4 O; `- q6 i" ?' q9 s# J+ T
{
. ^" ^8 C$ h. N* g4 o$ n/ }! e. Y
this.tvCourseMenu.Nodes.Add(tn.ChildNodes[0]);
4 Q: t4 U& ~/ D/ S) r( n
}
1 u% b. d! o: Z7 [# b% s3 [' ~
【理由】上面说了已经
8 D! A9 K+ o/ G1 P9 ~( G
1 w) I& n+ q/ g9 F) |( j" O p
终于弄好了,在做这个遇到step2中的问题的时候去请教了一个实验室的师兄,结果直接说,“我基本不用服务器控件的”,巨囧啊~~看来微软的这种控件还是有一些优化空间的啊,难怪不断地有VS05、08、10
欢迎光临 晨鸟科技 (http://www.chenniao.com/cprofessor/)
Powered by Discuz! X3.2