晨鸟科技

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2010-8-2 19:51:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天比较郁闷的一件事情,就是用TreeView动态加载目录,从数据库中将目录读出来。
7 O, p/ g6 U' y3 H这个应该用动态规划比较简单,但是最近确实是用脑过度了,脑子里全是浆糊,就用下面要讲的死办法了~~==!* E0 w- d2 U; D4 M- h
因为数据库设计的时候没有考虑到动态目录树的问题,没有在数据表中比较有前瞻性地设置上级编号、下级编号,只能将不同级别的目录内同一个一个找出来,我的这次,就用到了三张表,采用3重循环将数据添加到TreeNode中去:
  1. step1:绑定节点数据. ]- @4 A6 P  B6 p" x
  2. public TreeNode GetTreeNode()1 V( ^8 }" A+ G
  3. {//这个函数还要做优化,因为这样写和数据库的交互会比较多,待有时间了再修改好了
    . ]0 s5 Y. B' u' V' `6 C+ P
  4.         int i = 0;
    + G, C0 v, h+ n# B9 q+ E
  5.         int n = 0;8 _( R6 \  F. P+ u# B* Y% j
  6. / q6 E! p8 X2 d3 S& Y' [
  7.         this.currentUserID = (int)Session[SessionStr.CurrentUserID];$ Q. i7 p# }& v# [  p' K" I
  8. 1 J8 B; q9 x/ y0 `: d
  9.         TreeNode treeNode = new TreeNode();
    # Y" h9 a! T2 q) C0 ^5 O
  10.         DataTable dtCourse = CourseManagementBL.GetCourseIDListByStudentUserID(this.currentUserID);
    " O- [" l* _, X# C
  11.         foreach (DataRow row in dtCourse.Rows)
    $ V4 u6 _$ K* L! K0 {
  12.         {
    ; c1 W8 q) a9 m% P. `
  13.             treeNode.ChildNodes.Add(new TreeNode(row[1].ToString()));; n' p5 u& B4 g- I" P. U1 ?
  14.             foreach (DataRow Experiment_row in ExperimentManagementBL.GetExperimentNameListByCourseID(int.Parse(row["courseID"].ToString())).Rows)
    2 L4 |) O9 k# g6 c) \2 y) G
  15.             {% C. e) A  n7 C* h
  16.                 TreeNode expNode = new TreeNode();2 d# `1 P: z& c/ h$ r8 [9 A+ m1 _
  17.                 expNode.Text = Experiment_row[1].ToString();4 q# E5 z; ^- I6 @% Y  `" d
  18.                 treeNode.ChildNodes[i].ChildNodes.Add(expNode);$ u0 c  S3 X* _; K
  19. 9 r, x, [# c5 P. T4 N
  20.                 //treeNode.ChildNodes[i].ChildNodes.Add(new TreeNode(Experiment_row[1].ToString()));
    9 |1 Q5 u2 s- ?$ E6 e2 t
  21.                 foreach (DataRow Practice_row in PracticeManagementBL.GetPracticeIDListByExperimentID(int.Parse(Experiment_row["experimentID"].ToString())).Rows)0 O6 ~" t2 |) t( J1 m
  22.                 {
    - ]0 i/ s3 p. v$ u! g+ t# ^% n6 C& I
  23.                     treeNode.ChildNodes[i].ChildNodes[n].ChildNodes.Add(new TreeNode(Practice_row[1].ToString()));/ {( N/ f& U0 A4 @) j
  24.                 }( t0 W( s1 M3 a1 }3 N2 M. q5 r
  25.                 n++;
    : J0 O! Q* z- {9 Z
  26.             }. n3 l0 s7 [) {( {
  27.             i++;
    + m' U0 X1 `# i2 E% j& T
  28.             ) ~) w' z/ Q& {, f+ b0 h) w
  29.         }
    3 R& c# {7 f& F5 ]$ l
  30.         return treeNode;5 c+ X% z5 e2 U7 o2 g- S, P
  31.     }
    ! y1 n2 \4 T0 h
复制代码
step2:将节点内容添加到TreeView中
, ?2 I) h  Z) j2 m( O. v+ m也就是在这一步发现了TreeView中一个比较奇怪的东西,每将treeNode中一个节点Add到treeView中时,会自动地将treeNode的被添加的这个节点删掉(为什么为什么为什么???),这样就不能用foreach了,因为foreach只能读只读的数据9 B! j* F6 j! y& p6 n. u

, A* z; b! m; r: \6 ?) H那就直接Add整个treeNode吧(asp.net这个倒是挺自动化的),代码简单:
1 {! A: x: {3 Q7 ~2 k( aTreeNode tn = this.GetTreeNode();7 t; d' Q3 f* X: m0 b, `
this.tvCourseMenu.Nodes.Add(tn); ) u7 e" [5 k& {' C4 [/ [  u
问题也有,我用GetTreeNode函数返回的是一个TreeNode,是一个,所以生成的目录最上级是一个空的根目录(我在做数据绑定的时候没有绑定根目录的值啦,当然如果绑定了也可以没有下面的step3了),我想去掉这个,肯定不能Remove啦,因为Remove根目录,整个的都没啦。
) \- [' w  l* w/ Z/ d' v& ]step3:
' [/ I' t  S5 ?0 E用循环绑定根目录的子目录
/ k7 ]2 j) r* q4 X( |3 d* U$ ]0 `【不能这样】2 f) P3 H! H: ^' K* U2 v' |
for (int i = 0; i < tn.ChildNodes.Count;)2 W! }1 u% k" I5 E3 b
            {9 g) I3 Y. C  v
                this.tvCourseMenu.Nodes.Add(tn.ChildNodes);               
0 ?! E! x$ ]: f9 m* o/ Z/ L            }
& E- a6 E9 Q5 i3 e8 l- P【只能这样】
* I5 E0 t. R7 s, k- u, swhile (tn.ChildNodes.Count != 0)( y6 L  m. Y. E6 q2 ~) S
            {; M6 F% J/ s2 G* U+ L+ m6 s& |1 c) e  V
                this.tvCourseMenu.Nodes.Add(tn.ChildNodes[0]);% I6 f' u+ U$ P# d2 @% V2 V4 ^
            }& a  m) F# J" n7 F! H( O
【理由】上面说了已经+ x# R; L+ {5 G* ]" {9 O
: J/ r$ i' x1 J' u% m2 U
终于弄好了,在做这个遇到step2中的问题的时候去请教了一个实验室的师兄,结果直接说,“我基本不用服务器控件的”,巨囧啊~~看来微软的这种控件还是有一些优化空间的啊,难怪不断地有VS05、08、10

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-6-21 19:24 , Processed in 6.062112 second(s), 9 queries , Wincache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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