動態載入Asp.net分頁控制項
來源:互聯網
上載者:User
asp.net|動態|分頁|載入|控制項 動態載入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 Form設計器產生的程式碼
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翻頁事件。
我認為對於多控制項的互操作,清楚事件的執行順序是很重要的,另外也有助於最佳化程式提高效能。