动态加载Asp.net分页控件
2024-07-10 12:56:44
供稿:网友
 
动态加载asp.net分页控件
郑佐2004-11-30
 在asp.net中动态加载控件比较简单,这里我讲得是对用户控件的加载,比较典型的就是被加载的用户控件里面包含回发事件,在回传回来的时候需要保持新的数据。
 先来构建分页用户控件,由于前面几篇文章都在讲这些东西,所以就直接拿过来改了改,分页代码可以查看上面的文章1,文章2,下面是用户控件的一部分代码。
public class pagingcontrol : system.web.ui.usercontrol
{
 private int pagecount;
 private int recordcount;
 ……
 private void page_load(object sender, system.eventargs e)
 {
 if(!page.ispostback)
 {
 datagriddatabind();
 }
 }
 //绑定数据
 private void datagriddatabind()
 {
 dataset ds = getcustomersdata(pageindex,pagesize,ref recordcount,ref pagecount);
 this.datagrid1.virtualitemcount = recordcount;
 this.datagrid1.datasource = ds;
 this.datagrid1.databind();
 setpagingstate();
 }
 //绑定新的页面
private void lbtnnavigation_click(object sender, system.eventargs e)
 {
 linkbutton btn = (linkbutton)sender;
 switch(btn.commandname)
 {
 case "first":
 pageindex = 0;
 break;
 case "prev":
 pageindex = pageindex - 1;
 break;
 case "next":
 pageindex = pageindex + 1;
 break;
 case "last":
 pageindex = pagecount - 1;
 break;
 }
 datagriddatabind(); 
 }
……
}
在上面我们注意到在页面load事件中判断if(!page.ispostback)来防止在回发加载的时候进行两次绑定,因为第一次完全没有必要,最终由lbtnnavigation_click中的绑定决定。
假设pagingcontrol.ascx为上面的用户控件的文件名,而且同page页面文件在同一目录,下面是aspnetcommonpaging.aspx文件的代码,为了动态加载,在页面上放了一个placeholder控件来加载先前的用户控件。
前台文件如下:
<%@ page language="c#" codebehind="aspnetcommonpaging.aspx.cs" autoeventwireup="false" inherits="aspnetpaging.aspnetcommonpaging" %>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" >
<html>
 <head>
 <title>aspnetcommonpaging</title> 
 </head>
 <body>
 <form id="form1" method="post" runat="server">
<asp:placeholder id="placeholder1" runat="server"></asp:placeholder>
 </form>
 </body>
</html>
后台代码文件也比较简单:
namespace aspnetpaging
{
 public class aspnetcommonpaging : system.web.ui.page
 {
 protected system.web.ui.webcontrols.placeholder placeholder1;
 
 private void page_load(object sender, system.eventargs e)
 {
 placeholder1.controls.add(page.loadcontrol("~/pagingcontrol.ascx"));
 }
 
 #region web 窗体设计器生成的代码
 override protected void oninit(eventargs e)
 {
 initializecomponent();
 base.oninit(e);
 }
 
 /// <summary>
 /// 设计器支持所需的方法 - 不要使用代码编辑器修改
 /// 此方法的内容。
 /// </summary>
 private void initializecomponent()
 { 
 this.load += new system.eventhandler(this.page_load);
 }
 #endregion
 }
}
 
这里的placeholder1.controls.add(page.loadcontrol("~/pagingcontrol.ascx"));就是把pagingcontrol用户控件载到当前页面上来。如果不想用placeholder,我们也可以使用其他容器控件,只要添加到controls集合就行了。
注意这里如果按下面这样处理,那面在页面回发的时候就会不被加载,那么也就不会触发分页事件。
private void page_load(object sender, system.eventargs e)
{
 if(!page.ispostback)
 placeholder1.controls.add(page.loadcontrol("~/pagingcontrol.ascx"));
}
现在让我们来看看主要事件的执行顺序:设置断点,得到下面的顺序。
第一次:页面oninit事件-->页面page_load事件à控件oninit事件à控件page_load事件。
翻页回发:页面oninit事件-->页面page_load事件à控件oninit事件à控件page_load事件à lbtnnavigation_click翻页事件。
如果我们把页面加载代码放在页面oninit事件:
override protected void oninit(eventargs e)
{
 initializecomponent();
 placeholder1.controls.add(page.loadcontrol("~/pagingcontrol.ascx"));
 base.oninit(e);
}
那么事件的执行顺序会是什么样呢?
第一次:页面oninit事件-->控件oninit事件à页面page_load事件à控件page_load事件。
翻页回发:页面oninit事件-->控件oninit事件à页面page_load事件à控件page_load事件à lbtnnavigation_click翻页事件。
我认为对于多控件的互操作,清楚事件的执行顺序是很重要的,另外也有助于优化程序提高性能。