当前位置:编程学习 > C#/ASP.NET >>

我的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
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,