异步加载treeview 不需要ajax,适用于.NET 2.0后所有版本
时间:2011-01-23 来源:massinger
最近做个小系统,但数据量的大量加载使得页面加载失败是经常的事情,真的是件痛苦的事情。
找了很多控件和方法,一开始的思路是ajax,看起来也很美好,但遇到了不少问题。
首先用了flytreeview/radtreeview两个控件,也支持Ajax异步加载,但flytreeview不支持text/value绑定,比较痛苦,radtreeview貌似还不错,但绑定xmldatasource很痛苦,xpath也不是很友好(可能是我不太熟悉)。
最后找了半天,发现还是原生的treeview就可以搞定,这里需要的是动态后台绑定,并使用TreeNodePopulate事件和
node.PopulateOnDemand = true; node.SelectAction = TreeNodeSelectAction.Expand;这两个属性。
前台直接上treeview控件,后台开始绑定,以下为示例:
protected void Page_Load(object sender, EventArgs e) { if (this.Session.IsNewSession) { Response.Redirect("~/access.aspx"); } if (!IsPostBack) { int user_id = (int)Session["user_id"]; catalog_info myCatalog = new catalog_info(); string str = "select * from catalog_info catalog_info INNER JOIN permission_catalog_info ON catalog_info.catalog_id = permission_catalog_info.catalog_id WHERE (permission_catalog_info.user_id ='" + user_id + "') and catalog_father_id='0' order by catalog_name desc"; DataSet myset = DbHelperSQL.Query(str); if (myset.Tables[0].Rows.Count > 0) { DataTable nodeTable = myset.Tables[0]; for (int i = 0; i < nodeTable.Rows.Count; i++) { TreeNode node = new TreeNode(); string nodetext = nodeTable.Rows[i][0].ToString(); node.Text = nodetext; node.Value = nodeTable.Rows[i][3].ToString(); if (myCatalog.Exists(node.Value)) { node.PopulateOnDemand = true; node.SelectAction = TreeNodeSelectAction.Expand; } TreeView1.Nodes.Add(node); } } } }
上面是treeview的顶层数据初始化,并动态设定相关节点的属性,
if (myCatalog.Exists(node.Value))
为需要展开的节点,即需要异步加载的节点,里面这两个属性必须设置,否则异步加载可能会失败。
异步加载事件:TreeNodePopulate
protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e) { string nodeSelect = "select * from catalog_info where catalog_father_id='" + e.Node.Value + "' order by catalog_name desc"; DataSet myset = DbHelperSQL.Query(nodeSelect); if (myset.Tables[0].Rows.Count > 0) { DataTable nodeTable = myset.Tables[0]; for (int i = 0; i < nodeTable.Rows.Count; i++) { TreeNode node = new TreeNode(); string nodetext = nodeTable.Rows[i][0].ToString(); node.Text = nodetext; node.Value = nodeTable.Rows[i][3].ToString(); if (myCatalog.Exists(node.Value)) { node.SelectAction = TreeNodeSelectAction.Expand; node.PopulateOnDemand = true; } e.Node.ChildNodes.Add(node); } } }
treeview内部自动实现了异步加载,无需ajax的使用,是不是很方便呢,当然效果可能没ajax的显示动态效果好。
相关阅读 更多 +