晨鸟科技

标题: 动态加载TreeView目录树之纠结篇 [打印本页]

作者: Star    时间: 2010-8-2 19:51
标题: 动态加载TreeView目录树之纠结篇
今天比较郁闷的一件事情,就是用TreeView动态加载目录,从数据库中将目录读出来。( |1 N0 K3 p. Z* p9 y
这个应该用动态规划比较简单,但是最近确实是用脑过度了,脑子里全是浆糊,就用下面要讲的死办法了~~==!
" a! D) f5 {$ O1 A因为数据库设计的时候没有考虑到动态目录树的问题,没有在数据表中比较有前瞻性地设置上级编号、下级编号,只能将不同级别的目录内同一个一个找出来,我的这次,就用到了三张表,采用3重循环将数据添加到TreeNode中去:
  1. step1:绑定节点数据6 X- Z  V$ C( c4 y! T
  2. public TreeNode GetTreeNode(). g5 a# z: p; L
  3. {//这个函数还要做优化,因为这样写和数据库的交互会比较多,待有时间了再修改好了
    4 s: ^0 `* f& p; o4 Z  A) {
  4.         int i = 0;
    + F# |8 m6 C1 a) V& U* W
  5.         int n = 0;; p$ j' d% e8 I7 K
  6. ) f1 e7 \2 W8 Q5 `, P1 D& R
  7.         this.currentUserID = (int)Session[SessionStr.CurrentUserID];! }: E, G7 S! q" G

  8. 7 D- O! R5 C* b
  9.         TreeNode treeNode = new TreeNode();* U0 i( `4 R8 g2 {' f' @8 u1 m! f" j
  10.         DataTable dtCourse = CourseManagementBL.GetCourseIDListByStudentUserID(this.currentUserID);
    " u  X! H) [7 a/ V, ?
  11.         foreach (DataRow row in dtCourse.Rows)
    9 C' y! A+ ?5 D9 L* y
  12.         {" [, Q6 I7 @0 E" x: M' Z, |2 F4 @- t
  13.             treeNode.ChildNodes.Add(new TreeNode(row[1].ToString()));6 G- J5 d2 R- A* j1 R4 V, I
  14.             foreach (DataRow Experiment_row in ExperimentManagementBL.GetExperimentNameListByCourseID(int.Parse(row["courseID"].ToString())).Rows)4 S3 {& X% t# B- R2 w
  15.             {
    2 ]! Q6 ]* }: }2 p9 j$ v2 ~
  16.                 TreeNode expNode = new TreeNode();% R- x( X0 Z' s: ?. T: W: H- F3 z3 }
  17.                 expNode.Text = Experiment_row[1].ToString();" G% K2 f6 v/ X" l
  18.                 treeNode.ChildNodes[i].ChildNodes.Add(expNode);9 g5 x/ v3 X0 K( A" J9 I

  19. # E/ I! |$ c5 M- Y% Q
  20.                 //treeNode.ChildNodes[i].ChildNodes.Add(new TreeNode(Experiment_row[1].ToString()));
    ' Z6 \$ r- ?% c5 O+ f% q1 ^
  21.                 foreach (DataRow Practice_row in PracticeManagementBL.GetPracticeIDListByExperimentID(int.Parse(Experiment_row["experimentID"].ToString())).Rows)* S6 W% F# E: Z2 {/ l! B
  22.                 {
    & s: S. @$ s6 |6 a4 u
  23.                     treeNode.ChildNodes[i].ChildNodes[n].ChildNodes.Add(new TreeNode(Practice_row[1].ToString()));
    . T7 q6 Y& w. p
  24.                 }
    . F$ d; w3 u+ w: x1 }+ M4 }7 u
  25.                 n++;
    7 m- D# x& U! r& t2 Z# [, S% \# ^
  26.             }
    , ]: }  v% X+ B6 I0 o! h
  27.             i++;
      s& P4 b9 A# K0 l4 ]4 M( x5 U  b
  28.             2 R) s9 Y1 o6 o/ ~: t: c9 r
  29.         }( A2 ~) _, W: [4 f$ n! l' M
  30.         return treeNode;
    : O8 }' A8 q, ?
  31.     }
    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! XTreeNode tn = this.GetTreeNode();
+ D: e% l: k9 m) d3 Qthis.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