晨鸟科技

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2010-8-2 19:51:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天比较郁闷的一件事情,就是用TreeView动态加载目录,从数据库中将目录读出来。0 x) o# P  a  Z/ S/ p' a1 D1 M
这个应该用动态规划比较简单,但是最近确实是用脑过度了,脑子里全是浆糊,就用下面要讲的死办法了~~==!
' ]5 \+ i4 C: Y因为数据库设计的时候没有考虑到动态目录树的问题,没有在数据表中比较有前瞻性地设置上级编号、下级编号,只能将不同级别的目录内同一个一个找出来,我的这次,就用到了三张表,采用3重循环将数据添加到TreeNode中去:
  1. step1:绑定节点数据
    - z/ j* I- }9 {; m0 o* r8 D
  2. public TreeNode GetTreeNode()( W1 L7 F% Q  {# x1 {& t
  3. {//这个函数还要做优化,因为这样写和数据库的交互会比较多,待有时间了再修改好了
    / ]8 G# B5 K  e: e+ R& i' c
  4.         int i = 0;8 D$ \9 C& {& O0 c9 G7 c
  5.         int n = 0;- H$ Z0 G. a0 k6 e9 c
  6. / i& B4 \; g) F% i6 W' [. b
  7.         this.currentUserID = (int)Session[SessionStr.CurrentUserID];
    $ R4 o1 a; E) V) ?9 o- g& a/ d" \

  8. 2 W& f3 B5 ?, G0 `/ e1 N
  9.         TreeNode treeNode = new TreeNode();
    : }$ H6 u7 T9 \  L
  10.         DataTable dtCourse = CourseManagementBL.GetCourseIDListByStudentUserID(this.currentUserID);
    3 I- ]& k2 H( [5 R7 t
  11.         foreach (DataRow row in dtCourse.Rows)/ c, q' ?4 U. l2 w! z! r6 z3 }
  12.         {4 c! Y8 T, {* }1 ^0 e
  13.             treeNode.ChildNodes.Add(new TreeNode(row[1].ToString()));( ]( ~  H7 M, X. A  e! _
  14.             foreach (DataRow Experiment_row in ExperimentManagementBL.GetExperimentNameListByCourseID(int.Parse(row["courseID"].ToString())).Rows)
    6 \  \1 w5 d4 M) ]; u2 r
  15.             {  l( t5 r9 q' e/ a! ]3 R
  16.                 TreeNode expNode = new TreeNode();7 q. X% G/ U7 l9 ]& U/ n
  17.                 expNode.Text = Experiment_row[1].ToString();
    . E, k# D" m) y3 j# s6 ^" P! e; B1 R
  18.                 treeNode.ChildNodes[i].ChildNodes.Add(expNode);
    $ z$ \( G: ]4 {0 N# s* o

  19.   d: [1 L! H, }/ c" `, e6 J
  20.                 //treeNode.ChildNodes[i].ChildNodes.Add(new TreeNode(Experiment_row[1].ToString()));5 \0 W& k( @7 O
  21.                 foreach (DataRow Practice_row in PracticeManagementBL.GetPracticeIDListByExperimentID(int.Parse(Experiment_row["experimentID"].ToString())).Rows)
    2 V( S, B  F* Z& |; ~+ H
  22.                 {
    / H, l" q5 ^7 ^( T( p# H& w/ `
  23.                     treeNode.ChildNodes[i].ChildNodes[n].ChildNodes.Add(new TreeNode(Practice_row[1].ToString()));
    8 M& m* A) T  Q% p  @7 Z; Z
  24.                 }$ x" H. c' {8 I! [
  25.                 n++;& `% W1 t% H2 z# S0 s
  26.             }
    / t/ F1 ^! T, Y! S
  27.             i++;
    2 I) c, r! O& O
  28.             
    8 T# b% x* s0 Z3 c
  29.         }1 X: N4 I4 m' D3 `. M  N/ P& a
  30.         return treeNode;
    7 @! R/ l8 I+ ^3 l) n4 [
  31.     }
      u% T  ^+ j' k: L8 J3 Y, [9 O0 _
复制代码
step2:将节点内容添加到TreeView中3 Z* S& o- n" T" h+ ?! ^
也就是在这一步发现了TreeView中一个比较奇怪的东西,每将treeNode中一个节点Add到treeView中时,会自动地将treeNode的被添加的这个节点删掉(为什么为什么为什么???),这样就不能用foreach了,因为foreach只能读只读的数据
+ ~8 F+ `7 ^. y( u$ r
; z; r1 o3 X3 x7 a4 t5 K  H; j那就直接Add整个treeNode吧(asp.net这个倒是挺自动化的),代码简单:
) T7 g: n5 K1 i! |TreeNode tn = this.GetTreeNode();) Z( S- z$ L; S
this.tvCourseMenu.Nodes.Add(tn);
  B3 [6 s) I4 e4 ?问题也有,我用GetTreeNode函数返回的是一个TreeNode,是一个,所以生成的目录最上级是一个空的根目录(我在做数据绑定的时候没有绑定根目录的值啦,当然如果绑定了也可以没有下面的step3了),我想去掉这个,肯定不能Remove啦,因为Remove根目录,整个的都没啦。
  Q$ p! [8 L+ N, ^step3:) y" a' Y4 ~# e+ m0 j5 w6 ?7 D
用循环绑定根目录的子目录! l3 {# ^& z! u% F0 H
【不能这样】
3 m+ m: h5 S$ n. mfor (int i = 0; i < tn.ChildNodes.Count;)
4 V2 x- |/ ^  a' t) W# U( H            {
% W" V& P- v' K% {+ a" s                this.tvCourseMenu.Nodes.Add(tn.ChildNodes);               
( b- X6 j& }, I3 i& ]2 J& Z            }
6 m. ^8 j, F4 p; y1 H  j* U) l. y" L/ k【只能这样】# _2 E$ P- \# @! J/ g" J5 G( K
while (tn.ChildNodes.Count != 0)) K& B  o$ R2 d: K. P
            {
  w3 K6 E( M( |! }# f" o  D                this.tvCourseMenu.Nodes.Add(tn.ChildNodes[0]);
  f  _: H2 D, @# W            }: X# {; U% d' @7 j1 r# K
【理由】上面说了已经
( {, r( B5 @. S- a
7 j: F& T4 J  k' s; O, ^终于弄好了,在做这个遇到step2中的问题的时候去请教了一个实验室的师兄,结果直接说,“我基本不用服务器控件的”,巨囧啊~~看来微软的这种控件还是有一些优化空间的啊,难怪不断地有VS05、08、10

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-12-13 05:01 , Processed in 6.066639 second(s), 9 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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