记录一下Treeview的异步加载。
最近做个小系统,但数据量的大量加载使得页面加载失败是经常的事情,真的是件痛苦的事情。
找了很多控件和方法,一开始的思路是ajax,看起来也很美好,但遇到了不少问题。
首先用了flytreeview/radtreeview两个控件,也支持Ajax异步加载,但flytreeview不支持text/value绑定,比较痛苦,radtreeview貌似还不错,但绑定xmldatasource很痛苦,xpath也不是很友好(可能是我不太熟悉)。
最后找了半天,发现还是原生的treeview就可以搞定,这里需要的是动态后台绑定,并使用TreeNodePopulate事件和
node.PopulateOnDemand = true; node.SelectAction = TreeNodeSelectAction.Expand;这两个属性。
前台直接上treeview控件,后台开始绑定,以下为示例:
01 | protected void Page_Load( object sender, EventArgs e) |
03 |
if ( this .Session.IsNewSession) |
05 |
Response.Redirect( "~/access.aspx" ); |
09 |
int user_id = ( int )Session[ "user_id" ]; |
10 |
catalog_info myCatalog = new catalog_info(); |
11 |
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" ; |
12 |
DataSet myset = DbHelperSQL.Query(str); |
13 |
if (myset.Tables[0].Rows.Count > 0) |
15 |
DataTable nodeTable = myset.Tables[0]; |
16 |
for ( int i = 0; i < nodeTable.Rows.Count; i++) |
18 |
TreeNode node = new TreeNode(); |
19 |
string nodetext = nodeTable.Rows[i][0].ToString(); |
21 |
node.Value = nodeTable.Rows[i][3].ToString(); |
23 |
if (myCatalog.Exists(node.Value)) |
25 |
node.PopulateOnDemand = true ; |
26 |
node.SelectAction = TreeNodeSelectAction.Expand; |
28 |
TreeView1.Nodes.Add(node); |
上面是treeview的顶层数据初始化,并动态设定相关节点的属性,
1 | if (myCatalog.Exists(node.Value)) |
为需要展开的节点,即需要异步加载的节点,里面这两个属性必须设置,否则异步加载可能会失败。
异步加载事件:TreeNodePopulate
01 | protected void TreeView1_TreeNodePopulate( object sender, TreeNodeEventArgs e) |
03 |
string nodeSelect = "select * from catalog_info where catalog_father_id='" + e.Node.Value + "' order by catalog_name desc" ; |
04 |
DataSet myset = DbHelperSQL.Query(nodeSelect); |
05 |
if (myset.Tables[0].Rows.Count > 0) |
07 |
DataTable nodeTable = myset.Tables[0]; |
08 |
for ( int i = 0; i < nodeTable.Rows.Count; i++) |
10 |
TreeNode node = new TreeNode(); |
11 |
string nodetext = nodeTable.Rows[i][0].ToString(); |
14 |
node.Value = nodeTable.Rows[i][3].ToString(); |
15 |
if (myCatalog.Exists(node.Value)) |
17 |
node.SelectAction = TreeNodeSelectAction.Expand; |
18 |
node.PopulateOnDemand = true ; |
20 |
e.Node.ChildNodes.Add(node); |
treeview内部自动实现了异步加载,无需ajax的使用,是不是很方便呢,当然效果可能没ajax的显示动态效果好。