晨鸟科技

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

作者: Star    时间: 2010-8-2 19:51
标题: 动态加载TreeView目录树之纠结篇
今天比较郁闷的一件事情,就是用TreeView动态加载目录,从数据库中将目录读出来。9 N2 o; f* S& c1 U1 s  c/ ]
这个应该用动态规划比较简单,但是最近确实是用脑过度了,脑子里全是浆糊,就用下面要讲的死办法了~~==!( y/ U$ {3 M; V
因为数据库设计的时候没有考虑到动态目录树的问题,没有在数据表中比较有前瞻性地设置上级编号、下级编号,只能将不同级别的目录内同一个一个找出来,我的这次,就用到了三张表,采用3重循环将数据添加到TreeNode中去:
  1. step1:绑定节点数据2 k1 k+ B0 [5 o/ X' f$ }2 I
  2. public TreeNode GetTreeNode()" I: x7 J8 M* T3 ~
  3. {//这个函数还要做优化,因为这样写和数据库的交互会比较多,待有时间了再修改好了2 O! n1 ^& Y* a4 a. V/ u; Q
  4.         int i = 0;, r& j  w! w  i* l9 R! L
  5.         int n = 0;: k, P; U3 n- v7 F

  6. ( v; g# K% q( O$ X* c: V! Y
  7.         this.currentUserID = (int)Session[SessionStr.CurrentUserID];
    ( H6 ?1 N- c* X2 [8 _- z

  8. # U& e3 D: T# V4 U% b
  9.         TreeNode treeNode = new TreeNode();
    ! {  p4 T% C0 N& \- A$ S
  10.         DataTable dtCourse = CourseManagementBL.GetCourseIDListByStudentUserID(this.currentUserID);
    3 ~" T0 W4 |3 ~  H9 }
  11.         foreach (DataRow row in dtCourse.Rows)
    * C, G; D7 d9 y, a  @7 {
  12.         {. V5 f  ^* \& y0 e- y
  13.             treeNode.ChildNodes.Add(new TreeNode(row[1].ToString()));
    ( h/ {6 A+ R- m" h
  14.             foreach (DataRow Experiment_row in ExperimentManagementBL.GetExperimentNameListByCourseID(int.Parse(row["courseID"].ToString())).Rows)
    9 d) `" u# Y, v! N  f7 |' g3 f
  15.             {) i2 D' F: p2 S5 u: X# ]4 o
  16.                 TreeNode expNode = new TreeNode();
    " K7 C0 ]1 y( \3 W. L; J  l
  17.                 expNode.Text = Experiment_row[1].ToString();' D* T4 n2 _/ T- V! ~$ v
  18.                 treeNode.ChildNodes[i].ChildNodes.Add(expNode);$ V# d: j# n% L

  19. : M$ G# f7 w; J. e# z0 [
  20.                 //treeNode.ChildNodes[i].ChildNodes.Add(new TreeNode(Experiment_row[1].ToString()));5 T) r) E8 [4 R$ H) e* K
  21.                 foreach (DataRow Practice_row in PracticeManagementBL.GetPracticeIDListByExperimentID(int.Parse(Experiment_row["experimentID"].ToString())).Rows)
    , Z: q/ Y5 l4 l+ x2 D, M  B7 ]0 Y: ]& @
  22.                 {2 _% g: q& T6 Q" {. }* R0 R, K
  23.                     treeNode.ChildNodes[i].ChildNodes[n].ChildNodes.Add(new TreeNode(Practice_row[1].ToString()));
    0 q1 y$ @0 Q8 s3 E, p
  24.                 }
    ' f: @$ B: k& h9 C
  25.                 n++;
    & {* R: @( o8 [
  26.             }
    8 l8 M8 Q" {  a
  27.             i++;+ V0 x+ Q4 S* X, \$ v4 o1 M
  28.             
    2 u9 G! a7 r$ P3 N1 U. H& z4 U4 g! f
  29.         }
    ! \' D; W% [" c0 U7 q- @0 l
  30.         return treeNode;
    3 }6 ~6 g! S: m% E
  31.     }3 P5 ^3 z0 T, B7 c. n4 S: @, r
复制代码
step2:将节点内容添加到TreeView中
" M) H/ e: ^( l& l0 i& J也就是在这一步发现了TreeView中一个比较奇怪的东西,每将treeNode中一个节点Add到treeView中时,会自动地将treeNode的被添加的这个节点删掉(为什么为什么为什么???),这样就不能用foreach了,因为foreach只能读只读的数据
/ V5 E% F7 T* T% B; h% O$ K! E# E[attach]72[/attach]6 b1 B9 d8 Q/ Z  O$ Z9 V) X2 Y) e, Z- B
那就直接Add整个treeNode吧(asp.net这个倒是挺自动化的),代码简单:
. |$ y( `! c2 m/ `1 nTreeNode tn = this.GetTreeNode();
6 Q; F% g- d/ i2 l0 {this.tvCourseMenu.Nodes.Add(tn); , Q6 y( M* S, d$ m  X( g
问题也有,我用GetTreeNode函数返回的是一个TreeNode,是一个,所以生成的目录最上级是一个空的根目录(我在做数据绑定的时候没有绑定根目录的值啦,当然如果绑定了也可以没有下面的step3了),我想去掉这个,肯定不能Remove啦,因为Remove根目录,整个的都没啦。" k4 V' g  _+ c: e/ k7 E6 ]3 d3 g6 V& Y
step3:
% |, H9 u$ `* n2 L% Y用循环绑定根目录的子目录
$ D7 E6 h7 b# H3 x. _' D/ p6 p【不能这样】- O, I0 v, a% B! U" ]) _( u
for (int i = 0; i < tn.ChildNodes.Count;)
1 ]% @8 t$ M2 Y! H1 {- h            {9 t: A3 [0 d9 h
                this.tvCourseMenu.Nodes.Add(tn.ChildNodes);               
% m- W2 l8 z, i: W9 e0 `9 h            }
  D/ b& r7 Q" [  p【只能这样】/ S+ F# [" x# O2 v. y$ w8 S
while (tn.ChildNodes.Count != 0)
% o1 t. J* ^9 W            {
3 M5 B+ u: v3 G3 D                this.tvCourseMenu.Nodes.Add(tn.ChildNodes[0]);
; m4 a5 y8 @/ X0 c4 q+ y! E            }- Y! b! a( g  Z3 G6 J
【理由】上面说了已经
" Q. Y8 M! m) R$ U' o- N  W4 m& N. S: ?* `; J7 B
终于弄好了,在做这个遇到step2中的问题的时候去请教了一个实验室的师兄,结果直接说,“我基本不用服务器控件的”,巨囧啊~~看来微软的这种控件还是有一些优化空间的啊,难怪不断地有VS05、08、10





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