晨鸟科技

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

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

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

  6. / n' O3 ?' `) z, q% q2 ~, V# C
  7.         this.currentUserID = (int)Session[SessionStr.CurrentUserID];
    8 }! |+ ?; ~, e  }1 |3 {. z
  8. + Y: [: D4 z) q
  9.         TreeNode treeNode = new TreeNode();' @5 b+ F" C' B0 Y
  10.         DataTable dtCourse = CourseManagementBL.GetCourseIDListByStudentUserID(this.currentUserID);# Z4 H  r+ S$ e; x) j' ?, A6 h' l
  11.         foreach (DataRow row in dtCourse.Rows)3 b3 u; h# y7 E* T+ M
  12.         {
    : P7 Z" N( `4 E; J5 }* c
  13.             treeNode.ChildNodes.Add(new TreeNode(row[1].ToString()));
    & w7 R) O. c( [/ F- K4 t: x
  14.             foreach (DataRow Experiment_row in ExperimentManagementBL.GetExperimentNameListByCourseID(int.Parse(row["courseID"].ToString())).Rows)
    * ]  k- u! i2 A9 R/ t( T
  15.             {; N  F4 @( A: ]: w; _$ i
  16.                 TreeNode expNode = new TreeNode();$ V) O; u, ~7 s3 ^5 R6 H
  17.                 expNode.Text = Experiment_row[1].ToString();0 U  X$ [2 z' C: N8 s8 _
  18.                 treeNode.ChildNodes[i].ChildNodes.Add(expNode);
    3 T- \( o% t4 G3 O

  19. ! h( z- |) ^. M) j( }* R* A
  20.                 //treeNode.ChildNodes[i].ChildNodes.Add(new TreeNode(Experiment_row[1].ToString()));
    1 X0 E7 t* U( [& {
  21.                 foreach (DataRow Practice_row in PracticeManagementBL.GetPracticeIDListByExperimentID(int.Parse(Experiment_row["experimentID"].ToString())).Rows)- r/ ^1 r8 G9 Z- Q% M& t2 J
  22.                 {
    5 t$ \$ r$ n! O& b8 C  [
  23.                     treeNode.ChildNodes[i].ChildNodes[n].ChildNodes.Add(new TreeNode(Practice_row[1].ToString()));( ]0 D: J" ?  f8 T" P: A2 Z
  24.                 }
    ( e' ~% `6 }$ E% n4 V0 P% c, j
  25.                 n++;' `) }. z3 ^7 U& F
  26.             }0 }4 m) w0 `9 k% m
  27.             i++;4 d0 {, v2 J' k, r' d
  28.             
    8 s& ?# Z3 ~' M2 U
  29.         }! k% Z- h0 z8 U
  30.         return treeNode;. B# p  Y5 d  z' d  E
  31.     }0 v1 x  h3 I' N
复制代码
step2:将节点内容添加到TreeView中& G% m. K) m" z! ]+ [
也就是在这一步发现了TreeView中一个比较奇怪的东西,每将treeNode中一个节点Add到treeView中时,会自动地将treeNode的被添加的这个节点删掉(为什么为什么为什么???),这样就不能用foreach了,因为foreach只能读只读的数据( k# D2 a$ j) k4 Z; n! q* w
& o, X2 D5 {0 A* v- t; O7 x
那就直接Add整个treeNode吧(asp.net这个倒是挺自动化的),代码简单:
6 `' c: a( L! G' e' Z4 k3 l, eTreeNode tn = this.GetTreeNode();6 S& q+ w5 H6 N0 C1 x* J
this.tvCourseMenu.Nodes.Add(tn);
8 @' ?9 G9 I( m" Q问题也有,我用GetTreeNode函数返回的是一个TreeNode,是一个,所以生成的目录最上级是一个空的根目录(我在做数据绑定的时候没有绑定根目录的值啦,当然如果绑定了也可以没有下面的step3了),我想去掉这个,肯定不能Remove啦,因为Remove根目录,整个的都没啦。
+ _2 I& S7 @7 @0 J5 G/ x  h0 {step3:
  p/ |% _. Y" r3 c用循环绑定根目录的子目录: M  U+ Q6 ~# T$ r+ l( H' ^
【不能这样】# w. _/ T" |# I  V( i! V' W$ X
for (int i = 0; i < tn.ChildNodes.Count;)
) q1 V2 q; R2 s            {; n. i7 X4 F! r' m! `( ~
                this.tvCourseMenu.Nodes.Add(tn.ChildNodes);                : V9 r1 X5 ^4 j7 o
            }% O4 K# l$ K' a- q2 V1 g5 d
【只能这样】7 }# ]) a# M1 `& [( z
while (tn.ChildNodes.Count != 0)4 m! ^6 g' ]9 D1 h$ u
            {. a# a# y- W& G- E4 H; O; p9 O3 X
                this.tvCourseMenu.Nodes.Add(tn.ChildNodes[0]);: O4 z+ M  w- v
            }
! h! E: w9 l; R, V  Y9 m6 r) P【理由】上面说了已经/ p' X1 ^6 S: m4 `' H  [. A

# h0 k0 r4 C8 m5 J- M8 }3 s& p终于弄好了,在做这个遇到step2中的问题的时候去请教了一个实验室的师兄,结果直接说,“我基本不用服务器控件的”,巨囧啊~~看来微软的这种控件还是有一些优化空间的啊,难怪不断地有VS05、08、10

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-6-21 15:00 , Processed in 6.087148 second(s), 16 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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