您的位置:首页 > 其它

不需要ajax,当展开treeview控件的时候加载数据

2011-07-20 10:59 190 查看
  最近做个系统,但数据量的大量加载使得页面加载变的非常慢,.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的显示动态效果好。但是这样控件显示的速度快了好多。忙了半天小有成就。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: