不需要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的显示动态效果好。但是这样控件显示的速度快了好多。忙了半天小有成就。
一开始的思路是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的显示动态效果好。但是这样控件显示的速度快了好多。忙了半天小有成就。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
相关文章推荐
- 使用Freemarker+springMVC时用Ajax加载数据,已经后台执行了,但是跳转到前台的时候报错
- ajax请求的与页面本身有的数据(页面加载时候存在)的一个区别
- JQuery、AJAX加载数据时候的loading加载动画实现步骤
- [原创]如何在MS Ajax Extensions 1.0中实现数据加载时的等待对话框
- easyui tree 展开节点时不重新加载数据
- easy UI datagrid加载的时候默认不加载数据
- ajax 技术同时加载多个结果集并赋于同一控件上解决数据冲突出现错乱现象方法
- Handler通信方式,不需要将数据回调回主线程,只需要告诉用户加载完成
- 页面的下拉加载效果基于ajax加载数据
- (转帖)关于easyui中的datagrid在加载数据时候报错:无法获取属性"Length"的值,对象为null或未定义
- Ajax 之使用 XMLHttp实现简单的异步数据加载
- jQuery学习笔记之 Ajax操作篇(一) - 数据加载
- 《AJAX学习心得分享-------(三)AJAX+JSON无刷新加载大量后台数据》
- ajax数据加载经验分享
- AJAX删除事件与加载数据
- 组织机构自动展开(数据少的时候可以借鉴)
- 滑轮滚动到页面底部ajax加载数据的实例
- Ajax异步加载web网页数据
- ajax加载数据后,bootstrap-select下拉无反应
- flask+sqlite3+echarts3+ajax 异步数据加载