最近做個系統,但資料量的大量載入使得頁面載入變的非常慢,.net的treeview控制項在資料量有幾百條的時候在用遞迴綁定的時候就已經比較慢了,真的是件痛苦的事情。
一開始的思路是ajax,看起來也很美好,但遇到了不少問題,可能是對ajax不太熟悉的原因。
折騰了半天,發現還是原生的treeview就可以搞定,這裡需要的是動態後台綁定,並使用TreeNodeExpanded事件和node.PopulateOnDemand=true; 這個屬性。
前台直接上treeview控制項,後台開始綁定,以下為樣本:
private void IniTree()
{
try
{
TreeData.Nodes.Clear();
DataRow[] rowList = Ds.Tables[0].Select("ParentID=0");
foreach (DataRow row in rowList)
{
TreeNode node = new TreeNode();
node.Text = row["CName"].ToString();
node.Value = row["DataID"].ToString();
//判斷節點是否有子節點,設定此節點是否為動態填充
if (PubFuncs.CheckDataTableRows(Ds.Tables[0].Select("ParentID=" + row["DataID"].ToString())))
{
node.PopulateOnDemand = true;
}
TreeData.Nodes.Add(node);
}
//樹預設只展開一層,會自動調用TreeNodeExpanded事件
TreeData.ExpandDepth = 1;
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// 建立樹的子結點
/// </summary>
public void CreateSubTree(TreeNode parentNode, string ParentID)
{
//清空父節點原有資料
parentNode.ChildNodes.Clear();
DataRow[] rowList = Ds.Tables[0].Select("ParentID=" + ParentID);
foreach (DataRow row in rowList)
{
TreeNode node = new TreeNode();
node.Text = row["CName"].ToString();
node.Value = row["DataID"].ToString();
//判斷節點是否有子節點,設定此節點是否為動態填充
if (PubFuncs.CheckDataTableRows(Ds.Tables[0].Select("ParentID=" + row["DataID"].ToString())))
{
node.PopulateOnDemand = true;
}
parentNode.ChildNodes.Add(node);
}
}
protected void TreeData_TreeNodeExpanded(object sender, TreeNodeEventArgs e)
{
//判斷當前展開節點是否有子節點,如果有不進行填充
//可以考慮不加判斷,每次展開的時候都重新載入,效率上會比較低
if (e.Node.ChildNodes.Count <= 0)
{
CreateSubTree(e.Node, e.Node.Value.Trim());
}
}
當然效果可能沒ajax的顯示動態效果好。但是這樣控制項顯示的速度快了好多。忙了半天小有成就。