晨鸟科技

标题: 动态加载TreeView目录树之纠结篇 [打印本页]

作者: Star    时间: 2010-8-2 19:51
标题: 动态加载TreeView目录树之纠结篇
今天比较郁闷的一件事情,就是用TreeView动态加载目录,从数据库中将目录读出来。
3 t# K% b# r% v) R1 Q( T* t( C% Y7 W这个应该用动态规划比较简单,但是最近确实是用脑过度了,脑子里全是浆糊,就用下面要讲的死办法了~~==!
2 w, p, L, k- h2 ]) |% D因为数据库设计的时候没有考虑到动态目录树的问题,没有在数据表中比较有前瞻性地设置上级编号、下级编号,只能将不同级别的目录内同一个一个找出来,我的这次,就用到了三张表,采用3重循环将数据添加到TreeNode中去:
  1. step1:绑定节点数据
    / h. V. @$ D; m: Q" q
  2. public TreeNode GetTreeNode()) G1 V  ^. e; @! R) I
  3. {//这个函数还要做优化,因为这样写和数据库的交互会比较多,待有时间了再修改好了
    , E4 O& q; G4 g; e0 w6 P. y2 z
  4.         int i = 0;
    0 U  y7 [' \/ ?( u8 [+ x% _
  5.         int n = 0;4 k7 D/ h$ i* J6 ~* H% `

  6. $ H8 Y# Y7 z2 k) H8 M/ ]
  7.         this.currentUserID = (int)Session[SessionStr.CurrentUserID];
    6 `. X7 r0 |; V7 p

  8. * n* Q/ e  e: `: Z( b
  9.         TreeNode treeNode = new TreeNode();( p2 c; K9 g. K' y" K+ N$ G
  10.         DataTable dtCourse = CourseManagementBL.GetCourseIDListByStudentUserID(this.currentUserID);
    . e: ]& ^- l- L9 X* e
  11.         foreach (DataRow row in dtCourse.Rows). H0 W' h: }3 c
  12.         {! Q! Z# G0 Z) Z( x
  13.             treeNode.ChildNodes.Add(new TreeNode(row[1].ToString()));1 Y  u! X! U% M, m( S
  14.             foreach (DataRow Experiment_row in ExperimentManagementBL.GetExperimentNameListByCourseID(int.Parse(row["courseID"].ToString())).Rows)
    % H% W/ Q* R& @1 ^5 F
  15.             {9 P: I& J5 M( o' W+ K: u  y
  16.                 TreeNode expNode = new TreeNode();/ ?2 T; R' N; R# h/ s
  17.                 expNode.Text = Experiment_row[1].ToString();  r9 \5 D% a5 }* r& R, h  @  d
  18.                 treeNode.ChildNodes[i].ChildNodes.Add(expNode);/ O- |5 {- X, \( T) s% k5 s

  19. ) n7 u0 {% {* q$ a/ d) H( F
  20.                 //treeNode.ChildNodes[i].ChildNodes.Add(new TreeNode(Experiment_row[1].ToString()));( `. B6 v1 P. o! S8 I& l" [
  21.                 foreach (DataRow Practice_row in PracticeManagementBL.GetPracticeIDListByExperimentID(int.Parse(Experiment_row["experimentID"].ToString())).Rows)3 V; y: p: D! @* @2 R
  22.                 {  f! |" L+ ~& c0 H# b. S& |9 ]
  23.                     treeNode.ChildNodes[i].ChildNodes[n].ChildNodes.Add(new TreeNode(Practice_row[1].ToString()));" x7 m( g0 v* ]3 L( w( Q
  24.                 }4 u' i, [2 A1 }  ^6 t2 O9 R. a
  25.                 n++;
    7 t. O7 P4 v+ F& ^* L0 X! e
  26.             }1 u4 R5 Q0 N; Z! {0 [, m0 T8 P
  27.             i++;
    0 Q% z: H4 L  ~4 ?4 E' X
  28.             
    - \. u& }' W/ n' h! v7 Q$ s+ |3 T
  29.         }/ _% g4 O" Z- B6 J5 f! X, Q7 \9 q
  30.         return treeNode;# W3 m8 ~! H' Z8 o5 F2 n7 q
  31.     }
    * U* h, W- t' S+ D* N
复制代码
step2:将节点内容添加到TreeView中  U) p* [2 ~# K3 H. O, {/ J. D
也就是在这一步发现了TreeView中一个比较奇怪的东西,每将treeNode中一个节点Add到treeView中时,会自动地将treeNode的被添加的这个节点删掉(为什么为什么为什么???),这样就不能用foreach了,因为foreach只能读只读的数据
9 B% M. k, L' z' ~" l, m' O[attach]72[/attach]7 `  e# Z, I/ p( B5 `
那就直接Add整个treeNode吧(asp.net这个倒是挺自动化的),代码简单:
! G7 h0 c& s' k9 g7 H7 rTreeNode tn = this.GetTreeNode();
# _7 H' q& c5 ~/ w" Kthis.tvCourseMenu.Nodes.Add(tn); $ g/ \4 d) x0 }5 G
问题也有,我用GetTreeNode函数返回的是一个TreeNode,是一个,所以生成的目录最上级是一个空的根目录(我在做数据绑定的时候没有绑定根目录的值啦,当然如果绑定了也可以没有下面的step3了),我想去掉这个,肯定不能Remove啦,因为Remove根目录,整个的都没啦。
% D0 M4 q3 c* C& H. O* M0 zstep3:
7 V/ j, k( V/ y# M用循环绑定根目录的子目录
5 x# B, c. T: l* I1 G- r. k( n/ k【不能这样】
6 u$ {5 `4 t, _2 g6 F: j% S. `for (int i = 0; i < tn.ChildNodes.Count;): J' p* t* l) {* I2 J
            {5 H* T9 K) K0 X# _* I7 O
                this.tvCourseMenu.Nodes.Add(tn.ChildNodes);               
7 K# k* h- g6 j- |& J& ^            }. o" h9 z4 f# u2 V" X
【只能这样】# h( e( d" R" S$ t; Q4 j
while (tn.ChildNodes.Count != 0)
4 [( h4 _* F+ L6 L& Q; y2 D            {4 O# V( @  @' w" N5 l( s; M+ ?
                this.tvCourseMenu.Nodes.Add(tn.ChildNodes[0]);; B4 w) X" ~- s, q2 P
            }+ J& v; j* `' _
【理由】上面说了已经: I. `$ ?# {# \. ?7 {' T
. ~" f' w+ _' ^5 L2 G; |( Q
终于弄好了,在做这个遇到step2中的问题的时候去请教了一个实验室的师兄,结果直接说,“我基本不用服务器控件的”,巨囧啊~~看来微软的这种控件还是有一些优化空间的啊,难怪不断地有VS05、08、10





欢迎光临 晨鸟科技 (http://www.chenniao.com/cprofessor/) Powered by Discuz! X3.2