1

私のasp.net Webページでは、ツリービュー コントロールに数千のノードがあり、ツリーの読み込みが非常に遅いです。ノード データは、以下のコードを使用して SQL データベースから取得されます。パフォーマンスを最適化または改善するために何ができるか。

public partial class TaxonomyAllTermsTree : System.Web.UI.Page
  {
  protected void Page_Load(object sender, EventArgs e)
  {

    if (!this.IsPostBack)
    {
        this.AddNodes(this.TreeView1.Nodes, 0, this.LoadData());
        TreeView1.CollapseAll();
    }

  }


  private void AddNodes(TreeNodeCollection nodes, int level, System.Data.DataTable dt)
  {
    string filterExp = string.Format("ParentID='{0}'", level);
    foreach (System.Data.DataRow r in dt.Select(filterExp))
    {
        TreeNode item = new TreeNode()
        {
            Text = r[2].ToString(),
            Value = r[1].ToString(),
            NavigateUrl = "SomeURL.aspx?TermID=" + r[0].ToString()
        };
        this.AddNodes(item.ChildNodes, int.Parse(r[0].ToString()), dt);
        nodes.Add(item);
    }
  }

  private System.Data.DataTable LoadData()
  {
    DataTable dt = new DataTable();
    string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ThesaurusConnectionString"].ConnectionString;

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        SqlCommand cmd = new SqlCommand("GetFullTree", connection);
        cmd.CommandType = CommandType.StoredProcedure;

        SqlDataAdapter da = new SqlDataAdapter(cmd);

        da.Fill(dt);

        return dt;
    }
  }
}
4

1 に答える 1

0

1) @Azhar で述べたように、ExpandDepthを 0 に設定します。

ExpandDepth- TreeView コントロールが初めて表示されるときに展開されるレベルの数を取得または設定します。

2) ASP.NET キャッシュを使用して DataTable を一定期間キャッシュに格納し、不必要なデータベース トリップを回避します。これにより、パフォーマンスが確実に向上します。

キャッシュに関する役立つ記事を次に示します。

  1. アイテムをキャッシュに追加する方法
  2. キャッシュからアイテムを削除する方法

そして、これが例です

//The item will be in the cache for 10 minutes
DataTable table = LoadData();
Cache.Insert("TreeView", table, null, DateTime.Now.AddMinutes(10), TimeSpan.Zero);

キーがキャッシュに存在するかどうかを確認し、キャッシュからデータをロードする場合は、データベースからデータをロードしてキャッシュに挿入します。

if (Cache["TreeView"] != null)
{
    var table = Cache["TreeView"] as DataTable;
    //Do something with the DataTable
}
else
{
    DataTable table = LoadData();
    Cache.Insert("TreeView", table, null, DateTime.Now.AddMinutes(1), TimeSpan.Zero);
} 

これらの例がお役に立てば幸いです。

于 2013-02-12T06:46:46.167 に答える