100分求大侠优化代码。。。asp:TreeView控件

anmpap 2010-11-17 05:16:14
先放代码


< 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千个节点都要一分钟(发布到服务器,本机几秒)

用事件刷新用户不喜欢。。。
不知道大家有没有什么好办法没。。

临表涕零不知所云




...全文
94 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
anmpap 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 net_lover 的回复:]
参见
http://blog.csdn.net/ikmb/archive/2008/10/16/3084826.aspx
[/Quote]

谢谢 我都看看先
孟子E章 2010-11-17
  • 打赏
  • 举报
回复
参见
http://blog.csdn.net/ikmb/archive/2008/10/16/3084826.aspx
hookyzlr 2010-11-17
  • 打赏
  • 举报
回复
先加载顶级的,点击在加载子集。这个比较合理。
anmpap 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zorrowust 的回复:]
你搜一下梅花雪树

CSDN社区中心左侧好像就是那样做的

用的是ajax,就是点开哪一层才捞相应的数据
[/Quote]
好的
孟子E章 2010-11-17
  • 打赏
  • 举报
回复
采用ajax无刷新实现。动态加载
anmpap 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fellowcheng 的回复:]
C# code
DataTable dtlModel = new DataTable();
private void CreateData() {
dtlModel.Columns.Add("id", typeof(Int32));
dtlModel.Columns.Add("pid", typeof(Int32));
……
[/Quote]

谢谢 我先看看
anmpap 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 int64 的回复:]
5个foreach 嵌套

是否可以不全部加载,在点击某一个节点,要展开这个节点的时侯加载下一层。
[/Quote]

这样页面就要回发一次 查询的时候很麻烦。。。
我心里是想这么做的
fellowcheng 2010-11-17
  • 打赏
  • 举报
回复
 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
anmpap 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ihandler 的回复:]
先加载最顶级的,当点击展开时,再加载下一级的,你看CSDN左边论坛列表
[/Quote]

那个才那么点。。肯定是一次性加载完的
int64 2010-11-17
  • 打赏
  • 举报
回复
5个foreach 嵌套

是否可以不全部加载,在点击某一个节点,要展开这个节点的时侯加载下一层。
IHandler 2010-11-17
  • 打赏
  • 举报
回复
先加载最顶级的,当点击展开时,再加载下一级的,你看CSDN左边论坛列表
anmpap 2010-11-17
  • 打赏
  • 举报
回复
主要就是C# code拉。。。。
a824655 2010-11-17
  • 打赏
  • 举报
回复
友情帮顶,代码太长了!

62,067

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧