动态加载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翻页事件。
我认为对于多控件的互操作,清楚事件的执行顺序是很重要的,另外也有助于优化程序提高性能。