none
asp.net中TreeView的加载效率慢! RRS feed

  • 问题

  • 我是在asp.net中使用TreeView的,当点击节点时,就跳转到新的页面中,但是当节点太多的时候,TreeView加载就失败,我是通过for循环将节点信息显示出来的,
    也从网上找过资料,说是延迟加载,但是还是不太会,请各位帮帮忙啊,谢谢了!

    我的代码如下:

     private void Bind()
      {
        string rootStr = "标题";
        TreeNode rootNode = new TreeNode(rootStr);
        rootNode.Expanded = true;
        rootNode.Value = "-1";
        rootNode.Target = "bodyFrame";
        //每当点击节点时,都跳转到一个页面当中
        rootNode.NavigateUrl = "body.aspx?treeid=-1";
        //循环的调用函数进行添加子节点
        PopulateTreeViewFromSection("0", rootNode);
        this.TreeView1.Nodes.Add(rootNode);
      }
    //向TreeView中添加一级子节点
      private void PopulateTreeViewFromSection(string parentId, TreeNode parentNode)
      {
        DataSet ds = sectionBll.SelectAllSection();
        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
        {
          TreeNode myNode = new TreeNode(ds.Tables[0].Rows[i][1].ToString());
          if (i == 0)
          {
            myNode.Expanded = true;
          }
          myNode.Value = parentId;
          myNode.Target = "bodyFrame";
          //将树的结点编号、小区的结点编号传到body.aspx中
          myNode.NavigateUrl = "body.aspx?treeid=0&xqid="+ds.Tables[0].Rows[i][0].ToString();
          //循环调用函数添加子节点
          PopulateTreeViewFromFloorName("1", myNode,Convert.ToInt32(ds.Tables[0].Rows[i][0].ToString()));
          parentNode.ChildNodes.Add(myNode);
        }
      }
      ...........循环调用函数添加子节点
    • 已移动 孟宪会Moderator 2010年5月17日 6:00 (发件人:.NET Framework 一般性问题讨论区)
    2010年5月14日 8:34

答案

  • 你好!

         节点很多的情况下,可以考虑延迟加载,先加载第一级的节点,然后当用户展开的时候,再加载二级节点!

          在WinForm下有BeginUpdate方法来防止重绘,ASP.NET下没有类似的支持,所以我们只能自己想办法!


    周雪峰
    2010年5月14日 11:32
    版主
  • 你对这个事件的理解有误吧。

    MSDN文档上并没说会展开所有节点啊。

    http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.treeview.treenodeexpanded%28VS.80%29.aspx 


    Microsoft Online Community Support
    2010年5月18日 2:21
  • 关于此问题您可以从以下两方面入手:

    一、将该Treeview放置在一个ascx中,如果树状结构的导航不涉及到权限操作并且不易变化的话。可以指定当前ascx的【缓存】时间。这样可以避免每次的加载。【如果为aspx的话可以使用IFRAME】。

    二、逐级加载,每加载一个节点的时候,返回该节点的信息【另外包括是否有子节点,如果有则显示不同图标。】。再此,可以开放一个供客户端调用的webservices什么的,

         入口参数:节点ID。

        返回值:该节点的所有子节点【包含是否有子节点信息】。

    依据返回值创建相应的【DOM】元素,append到相应的位置即可。

     

    2010年5月18日 15:17

全部回复

  • 你好!

         节点很多的情况下,可以考虑延迟加载,先加载第一级的节点,然后当用户展开的时候,再加载二级节点!

          在WinForm下有BeginUpdate方法来防止重绘,ASP.NET下没有类似的支持,所以我们只能自己想办法!


    周雪峰
    2010年5月14日 11:32
    版主
  • 看来,在ASP.NET中还是有些麻烦啊,我使用TreeNodeExpanded事件时,只是触发第一层的,其他的层次的节点不会触发啊,

    有遇到类似的情况,请指点一下,谢谢!

    2010年5月17日 4:31
  • 你对这个事件的理解有误吧。

    MSDN文档上并没说会展开所有节点啊。

    http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.treeview.treenodeexpanded%28VS.80%29.aspx 


    Microsoft Online Community Support
    2010年5月18日 2:21
  • 关于此问题您可以从以下两方面入手:

    一、将该Treeview放置在一个ascx中,如果树状结构的导航不涉及到权限操作并且不易变化的话。可以指定当前ascx的【缓存】时间。这样可以避免每次的加载。【如果为aspx的话可以使用IFRAME】。

    二、逐级加载,每加载一个节点的时候,返回该节点的信息【另外包括是否有子节点,如果有则显示不同图标。】。再此,可以开放一个供客户端调用的webservices什么的,

         入口参数:节点ID。

        返回值:该节点的所有子节点【包含是否有子节点信息】。

    依据返回值创建相应的【DOM】元素,append到相应的位置即可。

     

    2010年5月18日 15:17