首页 > 编程 > .NET > 正文

动态加载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翻页事件。

我认为对于多控件的互操作,清楚事件的执行顺序是很重要的,另外也有助于优化程序提高性能。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表