asp.net网站在VS2005下用C#写了一个treeview,其中的子结点和叶节点的内容   均是从数据库中读取,数量很大,所以加载起来比较慢,在未加载完成时点击节点展开会报错,报错内容是MicroSoft   JScript错误:TreeView1_data内容未定义 听说有一种方法是分级加载
分级加载,第一次只加载根级,如果用户单击某个节点时(先判断是否加载过,如果未加载,则加载),但每一次只加载一个级,逐级加载直到末级,这样的话就会很快,而且用户未点击的节点也无需加载子级,所以就会很快. 非常想看到源码,非常感谢

解决方案 »

  1.   

    例如数据库利用分段编码的方式保存的树结构:
    A
    AA
    AAA
    AAB
    AB
    ABA
    ABB
    ...
    首先SELECT出来第一级节点(A.B.C...),把结果添加到根节点之下,然后给每个新节点加一个空节点,
    给TREEVIEW的展开事件编码,每次展开前首先判断被展开节点是否只有一个空节点,如果是,则SELECT他的子节点,并添加到该级下,如果无子节点,删掉空节点
      

  2.   

    应该使用动态加载技术1.首先生成第一层的节点,使节点的PopulateOnDemand=TRUE
    2.设置树控件,使PopulateNodesFromClient="true"
    3.定义树控件TreeNodePopulate即可可以参见MSDN上的例子
      

  3.   

    public partial class _Default : System.Web.UI.Page 
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                int i;
                for (i = 0; i < 3; i++)
                {
                    TreeView1.Nodes.Add(new TreeNode("A"));
                    TreeView1.Nodes[i].Value = i.ToString();
                }
            }
        }
        protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
        {
            int i, j;
            i = Convert.ToInt32(TreeView1.SelectedNode.Value.ToString());
            for (j = 0; j < 3; j++)
            {
                TreeView1.Nodes[i].ChildNodes.Add(new TreeNode("B"));
                TreeView1.Nodes[i].ChildNodes[j].NavigateUrl = "B";
            }
        }
    }不知道楼主是不是这个意思?
      

  4.   

    楼主可考虑用ajax实现,需要代码跟我说一声[email protected]
      

  5.   

    =.= 难道我4楼给的那个例子不行么?不用判断有没有加载过,它会自己判断,加载过的项不会自己再加载在load的时候把1级菜单加上,changed的时候再根据点的菜单的ID加载下一级的子菜单你新建一个空页面,在页面上拖一个TreeView ID TreeView1然后,触发事件选择SelectedNodeChanged,cs里面用这个
    protected void Page_Load(object sender, EventArgs e) 
        { 
            if (!IsPostBack) 
            { 
                int i; 
                for (i = 0; i  < 3; i++) 
                { 
                    TreeView1.Nodes.Add(new TreeNode("A")); 
                    TreeView1.Nodes[i].Value = i.ToString(); 
                } 
            } 
        } 
        protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e) 
        { 
            int i, j; 
            i = Convert.ToInt32(TreeView1.SelectedNode.Value.ToString()); 
            for (j = 0; j  < 3; j++) 
            { 
                TreeView1.Nodes[i].ChildNodes.Add(new TreeNode("B")); 
                TreeView1.Nodes[i].ChildNodes[j].NavigateUrl = "B"; 
            } 
        } 
    我觉得楼主应该是想要这种效果吧?