晨鸟科技

标题: 动态加载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中去:
  1. step1:绑定节点数据
    ' u% M1 r+ [! p  }. j5 d1 B# P+ ~
  2. public TreeNode GetTreeNode()
    1 q  R$ `/ w% z8 E) y
  3. {//这个函数还要做优化,因为这样写和数据库的交互会比较多,待有时间了再修改好了; ~( J. t) y- B% C4 l6 C6 I6 `8 n
  4.         int i = 0;
    , r" \2 G' x/ T, K
  5.         int n = 0;- b9 X+ n4 \8 H

  6. 0 k* V. W$ y8 Z
  7.         this.currentUserID = (int)Session[SessionStr.CurrentUserID];
    & Z% w' ?1 b8 L; A: R3 Q$ b5 Z

  8. 4 r: p* f6 k7 z' n6 S6 X1 p
  9.         TreeNode treeNode = new TreeNode();% c# v9 q( X( a& o7 I
  10.         DataTable dtCourse = CourseManagementBL.GetCourseIDListByStudentUserID(this.currentUserID);
    5 ]; l$ w: }$ b# o3 k) F6 @
  11.         foreach (DataRow row in dtCourse.Rows)( G& L* j, r1 d2 e# W! R; R
  12.         {8 F& f* Y/ T4 X: f! C& j
  13.             treeNode.ChildNodes.Add(new TreeNode(row[1].ToString()));2 l; G8 C5 O1 ^
  14.             foreach (DataRow Experiment_row in ExperimentManagementBL.GetExperimentNameListByCourseID(int.Parse(row["courseID"].ToString())).Rows)
    ' K9 |5 [# {# t, ^9 p! W& W
  15.             {/ L8 y* x+ F, h4 L5 {) Y
  16.                 TreeNode expNode = new TreeNode();
    ' c6 C3 M4 f0 Z' p# G$ A1 y
  17.                 expNode.Text = Experiment_row[1].ToString();
    1 U, @# l* _! ?! y5 k3 ^( z4 O6 V
  18.                 treeNode.ChildNodes[i].ChildNodes.Add(expNode);% c) V5 P0 G6 P1 N0 v* E, ]1 L, U

  19. % \4 C) o9 ?! [% }
  20.                 //treeNode.ChildNodes[i].ChildNodes.Add(new TreeNode(Experiment_row[1].ToString()));1 a. k8 t$ s' z! ~$ X) i4 d
  21.                 foreach (DataRow Practice_row in PracticeManagementBL.GetPracticeIDListByExperimentID(int.Parse(Experiment_row["experimentID"].ToString())).Rows)
    ) t# k1 Q8 A# j1 r: Z
  22.                 {
    , ~  j) g# O; K" w) Y$ r
  23.                     treeNode.ChildNodes[i].ChildNodes[n].ChildNodes.Add(new TreeNode(Practice_row[1].ToString()));+ f) x7 j! G! c0 k6 z
  24.                 }$ m. d0 R# m* \% @3 S
  25.                 n++;7 l) v6 X3 q' ?$ X: A0 j
  26.             }
    $ e5 |8 x$ A3 h. @: V( P2 x
  27.             i++;
    0 ]/ Q+ X5 M& K! t
  28.             
    ( _5 u# _# ?2 p  O% J* W- f
  29.         }  G: P5 t% l1 S8 J
  30.         return treeNode;
    ( N# \$ B7 s' K9 O  B# f1 |/ \1 |
  31.     }
    % `/ 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" lwhile (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