先放代码
 < ID="TreeView1" runat="server" ExpandDepth="1" ShowLines="True" 
                    ><%--ontreenodeexpanded="TreeView1_TreeNodeExpanded"--%>
                    <Nodes>
                        <asp:TreeNode NavigateUrl="~/Manager/Module/Property/Housing/HousingEstateListFrm.aspx"
                            Target="mainbody" Text="小区列表" Value="小区列表" ImageUrl="~/Manager/images/Property/tree1.gif">
                        </asp:TreeNode>
                    </Nodes>
                </asp:TreeView>存储过程-- 小区的基本信息 
exec('select id,housingEstateName from pro_HousingEstate  where id in ('+@housingEstateID+') order by housingEstateName' )        
         
         select id,PatchName, housingEstateID,isShowInTree from pro_Patch -- 一个小区分成多个片区,这是每一片区的信息          
           
          
      
select id,BuildingName,patchID,isShowInTree,isCommon from pro_BuildingRidgepole -- 一个片区有多栋,这是每一栋的信息              
    
          
          
select id,BuildingLayerName,BuildingRidgepoleID,isShowInTree,isCommon from pro_BuildingLayer -- 一栋有多层,这是每一层的信息          
   
          
select id,householdName,buildingLayerID,houseBooker,isCommon from pro_Household where isnull(isDelete,'N') = 'N'  --每一层有多户,,这是每一户的信息      
#region  加载树
        /// <summary>
        /// 加载树
        /// </summary>
        /// <param name="TNC"></param>
        private void InitTree(TreeNodeCollection TNC)
        {
           DataSet ds = DAL.ShowBll.Get_HousingEstateTreeRoles();//这里就是上面那5个表            TreeNode newNode;
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                /** 从小区直接去新增楼栋 **/
                newNode = new TreeNode(row["housingEstateName"].ToString(), row["ID"].ToString(), "~/Manager/images/Property/tree1.gif", "PatchFrm.aspx?active=list&ID=" + row["ID"].ToString() + "&name=" + row["housingEstateName"].ToString(), "mainbody");
                TNC.Add(newNode);
                DataRow[] drS1ShowNo = ds.Tables[1].Select("isnull(isShowInTree,'Y') ='N' and housingEstateID=" + row["ID"].ToString());
                foreach (DataRow row1 in drS1ShowNo)
                {
                    TreeNode newNode2;
                    DataRow[] drS2 = ds.Tables[2].Select("isnull(isShowInTree,'Y') ='Y' and patchID=" + row1["ID"].ToString());
                    foreach (DataRow row2 in drS2)
                    {
                        newNode2 = new TreeNode(row2["BuildingName"].ToString(), row2["ID"].ToString(), "~/Manager/images/Property/tree1.gif", "BuildingLayerFrm.aspx?active=list&ID=" + row2["ID"].ToString() + "&name=" + row2["BuildingName"].ToString() + "&isCommon=" + row2["isCommon"].ToString(), "mainbody");                        newNode.ChildNodes.Add(newNode2);                        DataRow[] drS3ShowNo = ds.Tables[3].Select("isnull(isShowInTree,'Y') ='N' and BuildingRidgepoleID=" + row2["ID"].ToString());
                        foreach (DataRow row3 in drS3ShowNo)
                        {
                            TreeNode newNode4;
                            DataRow[] drS4 = ds.Tables[4].Select("buildingLayerID=" + row3["ID"].ToString());
                            foreach (DataRow row4 in drS4)
                            {
                                newNode4 = new TreeNode(row4["householdName"].ToString(), row4["ID"].ToString(), "~/Manager/images/Property/details.gif", "HouseholdFrm.aspx?active=list&ID=" + row4["ID"].ToString() + "&name=" + row4["householdName"].ToString(), "mainbody");
                                newNode2.ChildNodes.Add(newNode4);
                            }
                        }
                    }                }            }
        }
        #endregion
节点太多 加载小区-楼栋-住户 
上千个现在1千个节点都要一分钟(发布到服务器,本机几秒)用事件刷新用户不喜欢
不知道大家有没有什么好办法没。。临表涕零不知所云

解决方案 »

  1.   

    先加载最顶级的,当点击展开时,再加载下一级的,你看CSDN左边论坛列表
      

  2.   

    5个foreach 嵌套是否可以不全部加载,在点击某一个节点,要展开这个节点的时侯加载下一层。
      

  3.   

     DataTable dtlModel = new DataTable();
            private void CreateData() {
                dtlModel.Columns.Add("id", typeof(Int32));
                dtlModel.Columns.Add("pid", typeof(Int32));
                dtlModel.Columns.Add("name");            for (int i = 1; i < 6; i++) {
                    DataRow dr = dtlModel.NewRow();
                    dr["id"] = i;
                    dr["pid"] = 0;
                    dr["name"] = i.ToString();
                    dtlModel.Rows.Add(dr);
                    for (int j = 1; j < 6; j++) {
                        DataRow dr1 = dtlModel.NewRow();
                        dr1["id"] = int.Parse(i.ToString() + j.ToString());
                        dr1["pid"] = i;
                        dr1["name"] = i + "_" + j;
                        dtlModel.Rows.Add(dr1);
                        for (int k = 1; k < 6; k++) {
                            DataRow dr2 = dtlModel.NewRow();
                            dr2["id"] = int.Parse(i.ToString() + j.ToString() + k.ToString());
                            dr2["pid"] = dr1["id"];
                            dr2["name"] = i + "_" + j + "_" + k;
                            dtlModel.Rows.Add(dr2);
                        }
                    }
                }
            }        private void BindTree(DataRow[] rows, TreeNode node) {
                foreach (DataRow r in rows) {
                    if (r["pid"] == DBNull.Value)
                        continue;                //如果是根结点,添加到TreeView控件
                    if (r["pid"].ToString() == "0") {
                        TreeNode node1 = new TreeNode();
                        node1.Text = string.Format("<input name='hd_{0}' type='hidden' value='{1}'/>{2}", r["id"], r["id"], r["name"].ToString());
                        node1.Value = r["id"].ToString();
                        
                        //node1.Target = "top";
                        TreeView1.Nodes.Add(node1);
                        BindTree(dtlModel.Select("pid=" + r["id"]), node1);
                    }
                    else if (node != null) {//否则添加到当前结点
                        TreeNode node1 = new TreeNode();
                        node1.Text = string.Format("<input name='hd_{0}' type='hidden' value='{1}'/>{2}", r["id"], r["id"], r["name"].ToString());
                        node1.Value = r["id"].ToString();
                        //node1.Target = "top";
                        node.ChildNodes.Add(node1);
                        BindTree(dtlModel.Select("pid=" + r["id"]), node1);//递归生成子树
                    }
                }
            }
    一般用递归来加载树,要求速度快的话,只能用ajax异步加载
    参见http://blog.csdn.net/peirenlei/archive/2008/11/19/3336546.aspx
      

  4.   

    你搜一下梅花雪树CSDN社区中心左侧好像就是那样做的用的是ajax,就是点开哪一层才捞相应的数据
      

  5.   

    采用ajax无刷新实现。动态加载
      

  6.   

    参见
    http://blog.csdn.net/ikmb/archive/2008/10/16/3084826.aspx