晨鸟科技

 找回密码
 注册
搜索
查看: 8751|回复: 0
打印 上一主题 下一主题

动态加载TreeView目录树之纠结篇

[复制链接]
跳转到指定楼层
楼主
发表于 2010-8-2 19:51:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天比较郁闷的一件事情,就是用TreeView动态加载目录,从数据库中将目录读出来。
4 \# a0 f* b+ ]- |+ w! G这个应该用动态规划比较简单,但是最近确实是用脑过度了,脑子里全是浆糊,就用下面要讲的死办法了~~==!0 o& A$ F! m! S" ?: Q, _
因为数据库设计的时候没有考虑到动态目录树的问题,没有在数据表中比较有前瞻性地设置上级编号、下级编号,只能将不同级别的目录内同一个一个找出来,我的这次,就用到了三张表,采用3重循环将数据添加到TreeNode中去:
  1. step1:绑定节点数据
      ~0 d" V! ~+ |% r  w$ {! p
  2. public TreeNode GetTreeNode()) m/ @& d8 Q+ _
  3. {//这个函数还要做优化,因为这样写和数据库的交互会比较多,待有时间了再修改好了. `5 V6 q) g+ l7 ?/ ^3 t9 z8 v
  4.         int i = 0;
    . m- z  Y, [9 b8 A' n+ Q- c) W
  5.         int n = 0;% T+ |. u  V) W7 H

  6. $ {+ v: g" s% p" r5 `  X
  7.         this.currentUserID = (int)Session[SessionStr.CurrentUserID];6 \! H: ^  V  B: a5 Z1 U

  8. ( |. n) T/ l5 x7 e0 _# B% R3 r) Q
  9.         TreeNode treeNode = new TreeNode();! X6 n9 W- \  I: q( ]' J/ I
  10.         DataTable dtCourse = CourseManagementBL.GetCourseIDListByStudentUserID(this.currentUserID);5 j8 T3 @  K6 t( X# V* ]& c
  11.         foreach (DataRow row in dtCourse.Rows)8 V% k1 ?. m& e* w/ u
  12.         {
    ( Y7 h$ B( g$ i0 N. j: c! Z
  13.             treeNode.ChildNodes.Add(new TreeNode(row[1].ToString()));" ~" n' V) H' t: i
  14.             foreach (DataRow Experiment_row in ExperimentManagementBL.GetExperimentNameListByCourseID(int.Parse(row["courseID"].ToString())).Rows)0 u6 e9 T* s+ _
  15.             {
    8 D- K7 [* K  t: ?/ F
  16.                 TreeNode expNode = new TreeNode();
    $ n7 b/ O  U* O5 ^- P) _9 y3 f) j; C  K
  17.                 expNode.Text = Experiment_row[1].ToString();9 \4 P4 Z6 V& g& _6 ~. Q  j. l
  18.                 treeNode.ChildNodes[i].ChildNodes.Add(expNode);5 O/ }! {. w2 P0 l- s
  19. % L* J* a* w1 X; a
  20.                 //treeNode.ChildNodes[i].ChildNodes.Add(new TreeNode(Experiment_row[1].ToString()));0 k: y6 F& ?% H/ S2 ~8 b
  21.                 foreach (DataRow Practice_row in PracticeManagementBL.GetPracticeIDListByExperimentID(int.Parse(Experiment_row["experimentID"].ToString())).Rows)
    * l% y4 i6 N9 _, {! b, g
  22.                 {
    ( I. j9 H: L( n  R6 _
  23.                     treeNode.ChildNodes[i].ChildNodes[n].ChildNodes.Add(new TreeNode(Practice_row[1].ToString()));
    # |) K7 J5 ?% i" j0 s9 b: f
  24.                 }
    1 c( j8 _0 E3 ~, w/ H
  25.                 n++;
    % Z1 [: |" U+ U) ~
  26.             }
    # v/ n% \1 r. a# v
  27.             i++;! V) V7 h0 v0 E
  28.             
    ) u2 l. E; |5 J  a0 Y+ k
  29.         }
    ) ~0 m2 l+ p  \$ |
  30.         return treeNode;
    ! X4 P7 x0 T0 Y$ i
  31.     }
    / @$ u; [' @8 P/ o
复制代码
step2:将节点内容添加到TreeView中
# d' N6 T1 @) E% x也就是在这一步发现了TreeView中一个比较奇怪的东西,每将treeNode中一个节点Add到treeView中时,会自动地将treeNode的被添加的这个节点删掉(为什么为什么为什么???),这样就不能用foreach了,因为foreach只能读只读的数据
2 t# \- Y$ y1 p# ~$ A& p
. o& T$ Y/ n: [, n$ W那就直接Add整个treeNode吧(asp.net这个倒是挺自动化的),代码简单:
5 g. _7 ~- ?7 RTreeNode tn = this.GetTreeNode();
3 C, d. p/ u/ j* w/ a' f/ Jthis.tvCourseMenu.Nodes.Add(tn);
) R/ M5 [$ x" s6 r& W问题也有,我用GetTreeNode函数返回的是一个TreeNode,是一个,所以生成的目录最上级是一个空的根目录(我在做数据绑定的时候没有绑定根目录的值啦,当然如果绑定了也可以没有下面的step3了),我想去掉这个,肯定不能Remove啦,因为Remove根目录,整个的都没啦。$ p5 |2 v; V# k& A
step3:" Y. }9 i8 D; o( {; R
用循环绑定根目录的子目录) T. }4 o* W. a$ `2 i; {
【不能这样】* V) L( v: N, ~; G& c# t2 f1 u3 u
for (int i = 0; i < tn.ChildNodes.Count;)
5 k; i% z( {- s2 j& z3 Y2 u' v            {' N& C8 s# b) h0 ^9 u6 A
                this.tvCourseMenu.Nodes.Add(tn.ChildNodes);               
( q# v7 z0 X' {            }
* X; O& V2 H" @& N! ~  G【只能这样】
0 P) L* C* h$ n9 U$ {while (tn.ChildNodes.Count != 0)
: G8 W$ i0 b+ I            {( V3 R- L( ^& X; k. g0 z
                this.tvCourseMenu.Nodes.Add(tn.ChildNodes[0]);
  i$ G' {( ^$ I            }* \' l+ ~7 E5 H0 z/ n
【理由】上面说了已经
: a) m* |4 ^0 N9 a$ z. M  f* \: {) l
终于弄好了,在做这个遇到step2中的问题的时候去请教了一个实验室的师兄,结果直接说,“我基本不用服务器控件的”,巨囧啊~~看来微软的这种控件还是有一些优化空间的啊,难怪不断地有VS05、08、10

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|晨鸟科技 ( 沪ICP备09012675号 )

GMT+8, 2026-3-15 05:18 , Processed in 6.063710 second(s), 8 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表