晨鸟科技

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

作者: Star    时间: 2010-8-2 19:51
标题: 动态加载TreeView目录树之纠结篇
今天比较郁闷的一件事情,就是用TreeView动态加载目录,从数据库中将目录读出来。
5 ^' \% Q4 s1 F/ Z3 I# ?6 Q0 Y8 K这个应该用动态规划比较简单,但是最近确实是用脑过度了,脑子里全是浆糊,就用下面要讲的死办法了~~==!
0 F% v% a( [3 w- U6 d2 k- s因为数据库设计的时候没有考虑到动态目录树的问题,没有在数据表中比较有前瞻性地设置上级编号、下级编号,只能将不同级别的目录内同一个一个找出来,我的这次,就用到了三张表,采用3重循环将数据添加到TreeNode中去:
  1. step1:绑定节点数据3 E  O; \1 n3 o( M8 D6 }# m
  2. public TreeNode GetTreeNode()5 r" t5 ^8 d  N, W$ ~
  3. {//这个函数还要做优化,因为这样写和数据库的交互会比较多,待有时间了再修改好了
    / I5 g( J% N" X) [
  4.         int i = 0;4 ~! C5 x- r1 {- ~0 Q. N
  5.         int n = 0;. N9 V% w% e, B, q

  6. " A* w" ~' |1 d2 _: a
  7.         this.currentUserID = (int)Session[SessionStr.CurrentUserID];
    : J' W# g: l, _

  8. ! ^" B' s2 \5 d6 s" ^6 {; \
  9.         TreeNode treeNode = new TreeNode();  z" s- t* E& v1 G, g* B5 \+ J
  10.         DataTable dtCourse = CourseManagementBL.GetCourseIDListByStudentUserID(this.currentUserID);
    " B( }: x& N/ i
  11.         foreach (DataRow row in dtCourse.Rows)( D- |! @  O% c0 \6 w/ Y8 [
  12.         {8 s6 V4 _$ X6 H- S" _; v2 p
  13.             treeNode.ChildNodes.Add(new TreeNode(row[1].ToString()));
    # [3 q8 ]2 v# H% x# i
  14.             foreach (DataRow Experiment_row in ExperimentManagementBL.GetExperimentNameListByCourseID(int.Parse(row["courseID"].ToString())).Rows)
    2 v4 ?9 P  t) u
  15.             {
    ( M2 L! p" H, ~, W5 `2 B
  16.                 TreeNode expNode = new TreeNode();
    & e$ [6 V! o6 d$ x* H* F
  17.                 expNode.Text = Experiment_row[1].ToString();' f6 U7 h  d; _4 Y3 _
  18.                 treeNode.ChildNodes[i].ChildNodes.Add(expNode);# R, h1 ]: E3 I: Y8 W" J1 p4 t

  19. 0 v; |  w  x. w- f+ J" `% w
  20.                 //treeNode.ChildNodes[i].ChildNodes.Add(new TreeNode(Experiment_row[1].ToString()));& B$ |- Q5 X4 Y/ V  ~8 k3 L
  21.                 foreach (DataRow Practice_row in PracticeManagementBL.GetPracticeIDListByExperimentID(int.Parse(Experiment_row["experimentID"].ToString())).Rows)
    7 G7 V% E# c  O9 S$ v
  22.                 {
    . l$ g& L, I. a/ @
  23.                     treeNode.ChildNodes[i].ChildNodes[n].ChildNodes.Add(new TreeNode(Practice_row[1].ToString()));8 K2 n1 ?+ j! X7 y  n2 I6 Z3 h
  24.                 }
    , Y% \' d& t1 M' `  u% e, {* b
  25.                 n++;" K. J4 Z& v) r! [: L0 \9 w
  26.             }: B; s; f3 t* N8 W$ ~
  27.             i++;
    * E. f/ i2 [1 |
  28.             
    ! r$ w7 [& h% L. h  g( v! g6 k2 {; P
  29.         }
    2 {- k, Q# z5 T; C8 i
  30.         return treeNode;
    + k# S* Q: h, \: [7 R. F3 H# U
  31.     }
    7 O* e; S  P' o5 h8 q* L
复制代码
step2:将节点内容添加到TreeView中1 P4 X' v# Y" w
也就是在这一步发现了TreeView中一个比较奇怪的东西,每将treeNode中一个节点Add到treeView中时,会自动地将treeNode的被添加的这个节点删掉(为什么为什么为什么???),这样就不能用foreach了,因为foreach只能读只读的数据
4 H0 V2 s& q& q0 u2 Q[attach]72[/attach]& ]2 q' `: U( M
那就直接Add整个treeNode吧(asp.net这个倒是挺自动化的),代码简单:
: }8 b- @7 G0 u6 r7 RTreeNode tn = this.GetTreeNode();- S% W1 \0 h' E4 P6 Q. w
this.tvCourseMenu.Nodes.Add(tn); 5 I7 ?3 S" R) P. o1 R
问题也有,我用GetTreeNode函数返回的是一个TreeNode,是一个,所以生成的目录最上级是一个空的根目录(我在做数据绑定的时候没有绑定根目录的值啦,当然如果绑定了也可以没有下面的step3了),我想去掉这个,肯定不能Remove啦,因为Remove根目录,整个的都没啦。- g: s, |# O2 s' l' i. N
step3:
2 n* g9 c6 _+ `8 `用循环绑定根目录的子目录4 @5 b2 l; m) i1 G6 V7 R5 p
【不能这样】
( m) Z7 `& T; I% \for (int i = 0; i < tn.ChildNodes.Count;)
  `- o7 {  X+ n, R            {
6 o  f4 H- p; q6 x  R$ J1 ?                this.tvCourseMenu.Nodes.Add(tn.ChildNodes);                4 B- m& b2 i' y& Y0 G: K% F, F
            }
0 Z- D6 O0 J* }3 T/ D/ y4 Y【只能这样】
$ ^: d+ \/ }7 gwhile (tn.ChildNodes.Count != 0)
2 y5 U! R2 F! k0 j! L            {! }& T* v6 M7 r8 l
                this.tvCourseMenu.Nodes.Add(tn.ChildNodes[0]);# ?$ w- Z, J. u  P
            }3 K2 |, M2 u' T: Y, o) p0 w! @
【理由】上面说了已经
5 z: a0 }6 b3 R6 N) s
; v$ s- g  ?+ z8 r+ i9 ~终于弄好了,在做这个遇到step2中的问题的时候去请教了一个实验室的师兄,结果直接说,“我基本不用服务器控件的”,巨囧啊~~看来微软的这种控件还是有一些优化空间的啊,难怪不断地有VS05、08、10





欢迎光临 晨鸟科技 (http://www.chenniao.com/cprofessor/) Powered by Discuz! X3.2