GridView的本身支持分頁,一般情況下我們可以通過如下幾個步驟實現(xiàn)分頁:
1、更改GrdView控件的AllowPaging屬性為true;
2、更改GrdView控件的PageSize屬性為一個數(shù)值(默認(rèn)為10);
3、更改GrdView控件的PageSetting屬性;
4、為GridView添加事件:OnPageIndexChanging
大多數(shù)情況下通過上邊的步驟就可以實現(xiàn)GridView的分頁了,當(dāng)然很多代碼需要你自己來寫。
但是有時候我們需要自定義分頁模板,還希望能通過更統(tǒng)一以及更少的代碼來實現(xiàn)這個分頁功能??紤]到這些問題,我實現(xiàn)了一個通用的GridView分頁模型,發(fā)布出來,僅供大家參考。
1、創(chuàng)建一個基礎(chǔ)頁面類
BasePage,繼承System.Web.UI.Page
在這個基類中,創(chuàng)建幾個通用的分頁屬性和方法,然后需要分頁的頁面都繼承這個基類。
public class BasePage : System.Web.UI.Page |
/// 總的記錄數(shù),目前僅用于自定義記錄數(shù) |
protected int GridView_RecordCount = 0; |
/// 需要設(shè)置GridView_RecordCount |
/// 如果一次性綁定全部數(shù)據(jù),不需要使用自定義,GridView可以通過DataSource自己獲取 |
protected bool IsUseCustomRecordCount = false ; |
/// 實現(xiàn)GridView數(shù)據(jù)綁定的虛方法 |
/// 在具體的頁面類中重寫這個方法,在PageTurn方法中就會調(diào)用重寫的方法,以實現(xiàn)分頁后的數(shù)據(jù)重新綁定 |
protected virtual void GridView_DataBind() |
/// <param name="sender">跳轉(zhuǎn)按鈕</param> |
/// <param name="e"></param> |
protected void GridView_PageTurn( object sender, EventArgs e) |
System.Web.UI.WebControls.Button btnGoPage; |
System.Web.UI.WebControls.GridView GridView1; |
System.Web.UI.WebControls.TextBox txtGoPage; |
btnGoPage = (System.Web.UI.WebControls.Button)sender; |
GridView1 = (System.Web.UI.WebControls.GridView)btnGoPage.NamingContainer.Parent.Parent; |
txtGoPage = (System.Web.UI.WebControls.TextBox)GridView1.BottomPagerRow.FindControl( "txtGoPage" ); |
MessageBox.Show( this .Page, "頁碼輸入框和跳轉(zhuǎn)按鈕都必須在GridView的分頁模板中!" ); |
if (! string .IsNullOrEmpty(txtGoPage.Text.Trim())) |
if ( int .TryParse(txtGoPage.Text.Trim(), out pageIndex)) |
if (pageIndex >= 0 && pageIndex < GridView1.PageCount) |
GridView1.PageIndex = pageIndex; |
MessageBox.Show( this .Page, "無效的頁碼!" ); |
/// <param name="sender"></param> |
/// <param name="e"></param> |
protected void GridView_PageIndexChanging( object sender, System.Web.UI.WebControls.GridViewPageEventArgs e) |
System.Web.UI.WebControls.GridView GridView1 = sender as System.Web.UI.WebControls.GridView; |
GridView1.PageIndex = e.NewPageIndex; |
/// GridView數(shù)據(jù)綁定完畢之后觸發(fā),顯示記錄數(shù) |
/// <param name="sender"></param> |
/// <param name="e"></param> |
protected void GridView_DataBound( object sender, EventArgs e) |
System.Web.UI.WebControls.GridView GridView1 = sender as System.Web.UI.WebControls.GridView; |
if (GridView1.BottomPagerRow == null ) |
GridView1.BottomPagerRow.Visible = true ; |
System.Web.UI.WebControls.Label lblRecorCount = (System.Web.UI.WebControls.Label)GridView1.BottomPagerRow.FindControl( "lblRecorCount" ); |
if (IsUseCustomRecordCount) |
lblRecorCount.Text = GridView_RecordCount.ToString(); |
if (GridView1.DataSource == null ) |
//根據(jù)數(shù)據(jù)類型,動態(tài)獲取綁定的數(shù)據(jù)源的記錄數(shù) |
if (GridView1.DataSource.GetType() == typeof (DataView)) |
lblRecorCount.Text = ((DataView)GridView1.DataSource).Count.ToString(); |
else if (GridView1.DataSource.GetType() == typeof (DataTable)) |
lblRecorCount.Text = ((DataTable)GridView1.DataSource).Rows.Count.ToString(); |
else if (GridView1.DataSource.GetType() == typeof (DataSet)) |
lblRecorCount.Text = ((DataSet)GridView1.DataSource).Tables[0].Rows.Count.ToString(); |
else if (GridView1.DataSource is Array) |
lblRecorCount.Text = ((Array)GridView1.DataSource).Length.ToString(); |
else if (GridView1.DataSource.GetType() is System.Collections.IList) |
lblRecorCount.Text = ((System.Collections.IList)GridView1.DataSource).Count.ToString(); |
else if (GridView1.DataSource.GetType() is System.Collections.ICollection) |
lblRecorCount.Text = ((System.Collections.ICollection)GridView1.DataSource).Count.ToString(); |
TspOALog.Write( "綁定到GridView的數(shù)據(jù)類型未知:" + GridView1.DataSource.GetType()); |
2、頁面cs文件繼承基類:BasePage
public partial class NewsList: BasePage
3、在頁面添加一個GridView并設(shè)置相關(guān)屬性
< asp:GridView ID = "GridView1" BorderStyle = "Solid" BorderWidth = "1px" BorderColor = "#73B7EA" |
Width = "100%" runat = "server" AutoGenerateColumns = "False" HorizontalAlign = "Center" |
BackColor = "White" CellPadding = "4" GridLines = "None" OnPageIndexChanging = "GridView_PageIndexChanging" PageSize = "10" |
AllowPaging = "true" OnDataBound = "GridView_DataBound" > |
< div style = "text-align: center;" >< span style = "color: Blue" > |
共有< asp:label id = "lblRecorCount" runat = "server" ></ asp:label >條記錄 |
第< asp:Label ID = "lblcurPage" ForeColor = "Blue" runat = "server" Text='<%# ((GridView)Container.Parent.Parent).PageIndex+1 %>'></ asp:Label >頁/共< asp:Label ID = "lblPageCount" ForeColor = "blue" runat = "server" Text='<%# ((GridView)Container.Parent.Parent).PageCount %>'></ asp:Label >頁</ span > |
< asp:LinkButton ID = "cmdFirstPage" runat = "server" CommandName = "Page" CommandArgument = "First" Enabled="<%# ((GridView)Container.Parent.Parent).PageIndex!=0 %>">首頁</ asp:LinkButton > |
< asp:LinkButton ID = "cmdPreview" runat = "server" CommandArgument = "Prev" CommandName = "Page" Enabled="<%# ((GridView)Container.Parent.Parent).PageIndex!=0 %>">上一頁</ asp:LinkButton > |
< asp:LinkButton ID = "cmdNext" runat = "server" CommandName = "Page" CommandArgument = "Next" Enabled="<%# ((GridView)Container.Parent.Parent).PageIndex!=((GridView)Container.Parent.Parent).PageCount-1 %>">下一頁</ asp:LinkButton > |
< asp:LinkButton ID = "cmdLastPage" runat = "server" CommandArgument = "Last" CommandName = "Page" Enabled="<%# ((GridView)Container.Parent.Parent).PageIndex!=((GridView)Container.Parent.Parent).PageCount-1 %>">尾頁</ asp:LinkButton > |
到< asp:TextBox ID = "txtGoPage" runat = "server" Text='<%# ((GridView)Container.Parent.Parent).PageIndex+1 %>' Width="30px" CssClass="simpletextbox"></ asp:TextBox >頁 |
< asp:Button ID = "Button3" runat = "server" Width = "40px" OnClick = "GridView_PageTurn" Text = "跳轉(zhuǎn)" CssClass = "simplebutton" /></ div > |
主要是:
AllowPaging:允許GridView分頁
PageSize:默認(rèn)10
OnDataBound:綁定到基類的事件,用于顯示總記錄數(shù)
OnPageIndexChanging:綁定到基類的事件,用于分頁的數(shù)據(jù)處理
PagerTemplate:包括記錄數(shù),當(dāng)前頁,總頁數(shù),首頁,尾頁,上一頁,下一頁,頁碼跳轉(zhuǎn)
其中頁碼跳轉(zhuǎn)事件綁定到基類中的:GridView_PageTurn
4、最后編寫獲取數(shù)據(jù)的方法
重寫基類的GridView_DataBind方法:其中查詢數(shù)據(jù),然后綁定到GridView。
protected override void GridView_DataBind() |
//獲取數(shù)據(jù),可以是獲取全部,也可以是只獲取當(dāng)前頁數(shù)據(jù) |
//如果你想自己設(shè)置總記錄數(shù),可以使用IsUseCustomRecordCount |
//這種情況適合分頁獲取少量數(shù)據(jù)的情況 |
IsUseCustomRecordCount= true ; |
GridView_RecordCount=10000; |
GridView1.DataSource = dv; |
以后只要有需要分頁的列表,繼承BasePage,然后設(shè)置相關(guān)屬性,編寫數(shù)據(jù)獲取代碼就可以了。不必在每個頁面都編寫OnPageIndexChanging,OnDataBound,以及頁碼跳轉(zhuǎn)的代碼,統(tǒng)一實現(xiàn),節(jié)省工作量。
你還可以使用統(tǒng)一的PageSize,只需要在BasePage添加一個屬性,然后在GridView中設(shè)置PageSize的屬性。