我的treeview代码执行很慢,请大家帮忙优化一下
如题,在本机刷新几次后竟然超时了。初次使用treeview,可能是递归使用的不当。请大家帮忙解决一下。完整代码如下:
public partial class Control_pro_left : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
Class_sdrk conn=new Class_sdrk();
SqlDataReader fox=conn.datareader("sdrk_get_pro_menu",0,"");
while (fox.Read())
{
TreeNode node=new TreeNode();
node.Text=fox["name"].ToString();
node.NavigateUrl="Products.aspx?d_class="+fox["id"].ToString();
this.Trv_list.Nodes.Add(node);
ShowNodes(node, fox["id"].ToString());
}
}
void ShowNodes(TreeNode node, string ParentID)
{
Class_sdrk conn= new Class_sdrk();
SqlDataReader fox = conn.datareader("sdrk_get_pro_menu", Convert.ToInt32(ParentID), "");
while (fox.Read())
{
TreeNode node_sub = new TreeNode();
node_sub.Text = fox["name"].ToString();
node_sub.NavigateUrl = "Products.aspx?d_class="+ParentID + "&x_class=" + fox["id"].ToString();
node.ChildNodes.Add(node_sub);
ShowNodes(node_sub, fox["id"].ToString());
}
}
} --------------------编程问答-------------------- 没人回答啊? --------------------编程问答-------------------- 循环的层次你的有三层,数据量多时,肯定耗时间。 --------------------编程问答-------------------- 数据量也不是很大(才20条左右),应该不至于的 --------------------编程问答-------------------- http://blog.csdn.net/taomanman/article/details/4816297 --------------------编程问答-------------------- 尽量只 一次性加载 数据,也就是说你尽量只访问一次数据库,像你这么访问数据库不悲剧么??
你可以先把数据放到内存中,然后用算法组成一棵数据树
然后再把数据树放到treeview中
--------------------编程问答-------------------- 用rowfilter也是不错的方法,相对比较简单....... --------------------编程问答-------------------- 建议 使用forrach()循环
--------------------编程问答-------------------- 主要问题是你的数据库连接未关闭。
其次 没必要在循环中从数据库取数据,既然数据量不大,就一次性取出来。 --------------------编程问答-------------------- using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
namespace 斯德瑞克
{
public partial class Control_pro_left : System.Web.UI.UserControl
{
DataTable dt = new DataTable();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
try
{
string conString = "Data Source=61.129.102.96;uid=sdrk;pwd=ling1208;Database=sdrk_0517_86986158";
SqlConnection con = new SqlConnection(conString);
con.Open();
string strSQL = "select * from sysparameters";
SqlDataAdapter da = new SqlDataAdapter(strSQL, con);
da.Fill(dt);
con.Close();
}
catch
{
}
finally
{
}
AddTreeNode(0, (TreeNode)null);
}
}
protected void AddTreeNode(int parentId, TreeNode pNode)
{
TreeNode tn1 = new TreeNode();
DataView dv = new DataView(dt);
//过滤parentId,得到当前节点的所有子节点
dv.RowFilter = "pid=" + parentId;
foreach (DataRowView drv in dv)
{
if (pNode == null)
{
tn1.Text = drv["name"].ToString(); //节点上要显示的名称
// tn1.NavigateUrl = drv["url"].ToString(); //点击节点名称,跳转到指定url页面
this.ling1208.Nodes.Add(tn1); //将根节点加入到TreeView中去
tn1.Expanded = true;
//递归调用
AddTreeNode(Int32.Parse(drv["id"].ToString()), tn1);
}
else
{
TreeNode tn2 = new TreeNode();
tn2.Text = drv["name"].ToString();
// tn2.NavigateUrl = drv["url"].ToString();
pNode.ChildNodes.Add(tn2);
tn1.Expanded = true;
//递归调用
AddTreeNode(Int32.Parse(drv["id"].ToString()), tn2);
}
}
}
}
}
这是我用taomanman修改后的代码,但提示:
索引必须位于该列表的界限内。
参数名: index
异常详细信息: System.ArgumentOutOfRangeException: 索引必须位于该列表的界限内。
参数名: index
源错误:
// tn1.NavigateUrl = drv["url"].ToString(); //点击节点名称,跳转到指定url页面
this.ling1208.Nodes.Add(tn1); //将根节点加入到TreeView中去
--------------------编程问答-------------------- 恩???你的ling1208是什么?是那个TreeView控件的ID??
你之前页面中的代码
this.Trv_list.Nodes.Add(node);
说明你的TreeView的ID为Trv_list
怎么后来ID你都改了?还是你敲错了????
而且你怎么命名空间怎么还中文???namespace 斯德瑞克
还有代码你照着修改,但是数据库的结构跟我举例的类似不?? --------------------编程问答-------------------- 。。。这递归相当于有几十个 或者几百个未关闭 数据库连接或datareader对象实例,肯定会卡了
补充:.NET技术 , ASP.NET