晨鸟科技

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

作者: Star    时间: 2010-8-2 19:51
标题: 动态加载TreeView目录树之纠结篇
今天比较郁闷的一件事情,就是用TreeView动态加载目录,从数据库中将目录读出来。. T% e  u4 Q& B$ C
这个应该用动态规划比较简单,但是最近确实是用脑过度了,脑子里全是浆糊,就用下面要讲的死办法了~~==!+ P( {) z! c7 Y7 k* `8 g
因为数据库设计的时候没有考虑到动态目录树的问题,没有在数据表中比较有前瞻性地设置上级编号、下级编号,只能将不同级别的目录内同一个一个找出来,我的这次,就用到了三张表,采用3重循环将数据添加到TreeNode中去:
  1. step1:绑定节点数据, f- Q0 r9 C  ~2 w6 j
  2. public TreeNode GetTreeNode()' C5 {5 t2 _5 F3 I# |
  3. {//这个函数还要做优化,因为这样写和数据库的交互会比较多,待有时间了再修改好了
    8 G* `2 t1 p+ Y+ d. i, @
  4.         int i = 0;
    : \. w; p) w5 [0 S0 J6 |& }8 H
  5.         int n = 0;; c; A+ A, m! b; a- v
  6. ( n2 ]7 M! w$ ^9 T/ t; v
  7.         this.currentUserID = (int)Session[SessionStr.CurrentUserID];
    # B9 B) }% {. x

  8. " O. X; Y5 t* x% x! D, F
  9.         TreeNode treeNode = new TreeNode();
    3 u  G$ l& b/ ?6 ?
  10.         DataTable dtCourse = CourseManagementBL.GetCourseIDListByStudentUserID(this.currentUserID);# E/ ]$ a1 \/ K+ Z' t
  11.         foreach (DataRow row in dtCourse.Rows)
    . |8 [5 ^- }$ I9 m% M+ J5 ^
  12.         {& b+ f. P/ [" j6 w& t* f% e6 j  V
  13.             treeNode.ChildNodes.Add(new TreeNode(row[1].ToString()));9 ^3 D7 z" b$ z3 o6 U
  14.             foreach (DataRow Experiment_row in ExperimentManagementBL.GetExperimentNameListByCourseID(int.Parse(row["courseID"].ToString())).Rows)
    $ b7 \' p) a1 K5 i0 R8 b! f# ?
  15.             {9 k( ~" @" `6 g4 K
  16.                 TreeNode expNode = new TreeNode();: B0 W* k2 B/ G
  17.                 expNode.Text = Experiment_row[1].ToString();3 ~  B4 E* t, \6 @. f5 K2 k
  18.                 treeNode.ChildNodes[i].ChildNodes.Add(expNode);& L0 C( j) S+ Y. Y
  19. ( ?! h# B9 F' R
  20.                 //treeNode.ChildNodes[i].ChildNodes.Add(new TreeNode(Experiment_row[1].ToString()));
    6 b5 ~" t+ Q/ @  B& H
  21.                 foreach (DataRow Practice_row in PracticeManagementBL.GetPracticeIDListByExperimentID(int.Parse(Experiment_row["experimentID"].ToString())).Rows)' G  l& T" H1 o1 B5 e
  22.                 {
    ! u5 G! M" Q9 y" U& j
  23.                     treeNode.ChildNodes[i].ChildNodes[n].ChildNodes.Add(new TreeNode(Practice_row[1].ToString()));) u% c2 T! H; C  ]. k% `/ m
  24.                 }
    1 I- z% g, M- e9 A
  25.                 n++;% P- k/ E  m2 H* d. T
  26.             }
    / U9 Q) I6 G9 ]  a1 t6 y8 x8 r
  27.             i++;
    % ?5 H, {( g5 o$ p1 Q- H) E1 R
  28.             7 c0 q1 T4 f$ s5 s
  29.         }- I6 y8 G8 J2 m4 w, |
  30.         return treeNode;8 T$ c8 B# k: a* V% [
  31.     }
    6 h7 z" h; u) O# R1 ?) T
复制代码
step2:将节点内容添加到TreeView中3 {" g; u0 N8 H  l  W0 \* P
也就是在这一步发现了TreeView中一个比较奇怪的东西,每将treeNode中一个节点Add到treeView中时,会自动地将treeNode的被添加的这个节点删掉(为什么为什么为什么???),这样就不能用foreach了,因为foreach只能读只读的数据
# e7 _* r% U. p/ Z4 b[attach]72[/attach]& z* E$ l* c  n' K9 {
那就直接Add整个treeNode吧(asp.net这个倒是挺自动化的),代码简单:6 P6 y) k6 O8 J/ b" R
TreeNode tn = this.GetTreeNode();
8 W/ D  Q& r( z) \9 x: B" Q. j4 dthis.tvCourseMenu.Nodes.Add(tn); $ j2 o: i+ A; e
问题也有,我用GetTreeNode函数返回的是一个TreeNode,是一个,所以生成的目录最上级是一个空的根目录(我在做数据绑定的时候没有绑定根目录的值啦,当然如果绑定了也可以没有下面的step3了),我想去掉这个,肯定不能Remove啦,因为Remove根目录,整个的都没啦。
5 D3 G6 h: [* S# K2 r. m. \" Kstep3:( P  P/ Y6 e* a
用循环绑定根目录的子目录: n* A1 j) U* j3 b, P3 ]3 g9 H
【不能这样】# x! V! S5 e7 r7 f0 @
for (int i = 0; i < tn.ChildNodes.Count;)
7 ^( I4 {9 f& U, ?" |! z% F) R            {
% ], l3 ]. ]/ m5 x+ J! A                this.tvCourseMenu.Nodes.Add(tn.ChildNodes);                # f5 \( w9 o; P% d: B
            }
3 ?. X7 i- B: T6 x4 k【只能这样】+ M4 t/ D* m/ z+ ]) y
while (tn.ChildNodes.Count != 0), L8 T* V; \- F- S
            {
, c, v7 x* E5 {3 e4 @% [' [/ }                this.tvCourseMenu.Nodes.Add(tn.ChildNodes[0]);) }4 ~& k- _$ Q& N* z+ ^9 {
            }! R3 z% F% m' A- Q; g
【理由】上面说了已经
- b& t' k0 @$ z8 p/ F/ T- I& y8 e# Y* X
终于弄好了,在做这个遇到step2中的问题的时候去请教了一个实验室的师兄,结果直接说,“我基本不用服务器控件的”,巨囧啊~~看来微软的这种控件还是有一些优化空间的啊,难怪不断地有VS05、08、10





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