晨鸟科技

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

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

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

  6. * O! _4 }% I* T7 [8 ^; w
  7.         this.currentUserID = (int)Session[SessionStr.CurrentUserID];$ p7 Y$ L/ r& o8 @9 ^0 d
  8. * s4 n& z- r& d, S( i% s0 W5 G
  9.         TreeNode treeNode = new TreeNode();
    # B, [! x/ r* ~1 }' |4 t! h+ ~, H
  10.         DataTable dtCourse = CourseManagementBL.GetCourseIDListByStudentUserID(this.currentUserID);
    0 U0 |) W5 |. N9 O
  11.         foreach (DataRow row in dtCourse.Rows)1 l& B: w5 }. u9 d; z
  12.         {
    * \+ L) S& ~% K+ p3 A; C
  13.             treeNode.ChildNodes.Add(new TreeNode(row[1].ToString()));7 h8 ^7 e7 D) v9 q
  14.             foreach (DataRow Experiment_row in ExperimentManagementBL.GetExperimentNameListByCourseID(int.Parse(row["courseID"].ToString())).Rows)
    , V2 f  f; S3 F
  15.             {) C1 S! p. y2 B% }6 C5 T3 b
  16.                 TreeNode expNode = new TreeNode();
    * n! g! a1 B9 g/ P2 z4 f; F
  17.                 expNode.Text = Experiment_row[1].ToString();  b$ j% B9 U) H/ }& L. O
  18.                 treeNode.ChildNodes[i].ChildNodes.Add(expNode);$ H( B" {% s2 G! |  U- _) x

  19. 1 J2 F0 \; o5 l) o0 ]$ t8 y* {# s5 i
  20.                 //treeNode.ChildNodes[i].ChildNodes.Add(new TreeNode(Experiment_row[1].ToString()));! p3 P& Q& R- t
  21.                 foreach (DataRow Practice_row in PracticeManagementBL.GetPracticeIDListByExperimentID(int.Parse(Experiment_row["experimentID"].ToString())).Rows)4 N: n, {9 e& Q. h9 E) x: b: B' M
  22.                 {2 C: A0 w! [3 _. f: k' H7 ^
  23.                     treeNode.ChildNodes[i].ChildNodes[n].ChildNodes.Add(new TreeNode(Practice_row[1].ToString()));
    ; @0 F5 B6 F3 R4 p: P  f( h
  24.                 }
    - x8 l* z! _, F/ B& ^, M
  25.                 n++;& m# y1 L- E' x( }$ h
  26.             }, _/ C/ y. r+ u0 E! P) I' x2 N
  27.             i++;# C( t# N" H# v4 h
  28.             
    $ V' j) D9 Y) O9 p
  29.         }
    ( {, s' B- i+ G& X. @9 y
  30.         return treeNode;# J  d8 G* K" w+ p' L  c
  31.     }
    7 t5 a% w, I' J. S. J4 ?2 X% p: W
复制代码
step2:将节点内容添加到TreeView中) r4 d& C' H" {, B* `
也就是在这一步发现了TreeView中一个比较奇怪的东西,每将treeNode中一个节点Add到treeView中时,会自动地将treeNode的被添加的这个节点删掉(为什么为什么为什么???),这样就不能用foreach了,因为foreach只能读只读的数据
* d6 I5 G7 ^! `9 q7 C8 B. }' Z
! e% M1 f0 n- |" j那就直接Add整个treeNode吧(asp.net这个倒是挺自动化的),代码简单:
# H7 G" y/ R$ ~/ I4 B  z9 W$ qTreeNode tn = this.GetTreeNode();( m5 S' h  C: k9 R
this.tvCourseMenu.Nodes.Add(tn);
3 W) x2 e1 t1 I0 x* l问题也有,我用GetTreeNode函数返回的是一个TreeNode,是一个,所以生成的目录最上级是一个空的根目录(我在做数据绑定的时候没有绑定根目录的值啦,当然如果绑定了也可以没有下面的step3了),我想去掉这个,肯定不能Remove啦,因为Remove根目录,整个的都没啦。1 B0 q' B6 g% N! v5 v! `+ M
step3:3 |% ?: Z* G9 m: C
用循环绑定根目录的子目录
% {9 W6 ?0 s& q  O+ B【不能这样】
0 `; @+ v3 D! Sfor (int i = 0; i < tn.ChildNodes.Count;)# \7 `/ g  z8 B2 T- E
            {) o8 `$ Z. \# m
                this.tvCourseMenu.Nodes.Add(tn.ChildNodes);               
9 \( ]1 Z, A5 |. H$ @! |( ^            }
6 h$ I& j) G' S【只能这样】" V5 J0 ]3 F: L7 m% ~' H" J
while (tn.ChildNodes.Count != 0)
  X0 }; s& i6 g9 G/ y) w: Z: ^            {3 e" I4 j0 c$ l* G1 K7 \. r
                this.tvCourseMenu.Nodes.Add(tn.ChildNodes[0]);
& W' F0 r& E6 J* ]            }
0 @) x: b. a% v; c+ L+ W【理由】上面说了已经
1 p# ?4 i3 i1 p- p9 y% V5 t8 M& _4 ~( K% v9 q
终于弄好了,在做这个遇到step2中的问题的时候去请教了一个实验室的师兄,结果直接说,“我基本不用服务器控件的”,巨囧啊~~看来微软的这种控件还是有一些优化空间的啊,难怪不断地有VS05、08、10

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-8-14 18:02 , Processed in 6.074807 second(s), 8 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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