asp.net 分页控件
前台
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Pager.ascx.cs" Inherits="Controls_Core_Pager" %> <style type="text/css"> .GridViewPagerStyle { background-position: top; background-repeat: repeat-x; border-bottom: 1px solid #ABC7EC; color: #15428B; font-weight: bold; } .GridViewPagerStyle table { margin: auto; text-align: center; } .GridViewPagerStyle table td { border: 0px; } .GridViewPagerStyle a { color: #15428B; padding: 0px 1px 0px 1px; text-decoration: none; } .GridViewPagerStyle span { color: red; font-weight: bold; padding: 0px 1px 0px 1px; text-decoration: none; } </style> <script type="text/javascript" language="javascript"> function checkGo() { var txtGoObj = document.getElementById(document.getElementById('hidTextBoxGoClientID').value); if (txtGoObj && txtGoObj.value == '') { txtGoObj.focus(); return false; } return true; } </script> <center> <div style="background-color: #BBD5EC; width: 100%;"> <table class="GridViewPagerStyle" cellpadding="1" cellspacing="1" > <tr align="center"> <td valign="middle" runat="server" id="tdAll" style="display: none;"> <asp:LinkButton ID="imgAll" Text="显示所有" runat="server" OnClick="All_Click" /> | </td> <td valign="middle" runat="server" id="tdPageCount"> 共<asp:Label ID="lblPageCount" runat="server" Text="Label" Style="color: Red;"></asp:Label>页/<asp:Label ID="lblRecordCount" runat="server" Text="Label" Style="color: Red;"></asp:Label>条记录 | </td> <td valign="middle" runat="server" id="tdCurrentIndex"> 当前第<asp:Label ID="lblCurrentPageIndex" runat="server" Text="Label" Style="color: Red;"></asp:Label>页 </td> <td valign="middle"> <asp:LinkButton ID="imgFirstPage" runat="server" OnClick="imgFirstPage_Click" Text="首页"></asp:LinkButton> </td> <td valign="middle"> <asp:LinkButton ID="imgPrePage" runat="server" OnClick="imgPrePage_Click" Text="上页"></asp:LinkButton> </td> <td valign="middle"> <asp:LinkButton ID="imgNextPage" runat="server" OnClick="imgNextPage_Click" Text="下页"></asp:LinkButton> </td> <td valign="middle"> <asp:LinkButton ID="imgLastPage" runat="server" OnClick="imgLastPage_Click" Text="尾页"></asp:LinkButton> </td> <td> </td> <td valign="middle" runat="server" id="tdTextGo"> 转到<asp:TextBox ID="txtGo" runat="server" Width="20px" Height="12" onkeyup="this.value=this.value.replace(/\D/g,'')" onafterpaste="this.value=this.value.replace(/\D/g,'')"></asp:TextBox>页 </td> <td valign="middle" runat="server" id="tdImgGo" align="center"> <asp:ImageButton ID="imgGo" AlternateText="跳转页面" ImageUrl="../../Images/Go.gif" OnClick="imgGo_Click" ImageAlign="Middle" runat="server" Height="21px" Width="28px" OnClientClick=" return checkGo(); " /> </td> </tr> </table> </div> </center> <asp:HiddenField ID="hidCurrentPageIndex" runat="server" /> <asp:HiddenField ID="hidPageSize" runat="server" />
后台:
public partial class Controls_Core_Pager : System.Web.UI.UserControl { public delegate void GridViewDelegate(); #region Delegate public event GridViewDelegate InitLoadData; public event GridViewDelegate PageingLoadData; public event GridViewDelegate BeforePageing; public event GridViewDelegate AfterPageing; private const string firstenabledimgurl = "~/Image/pager/first.gif"; private const string firstdisabledimgurl = "~/image/pager/first_disabled.gif"; private const string lastenabledimgurl = "~/image/pager/last.gif"; private const string lastdisabledimgurl = "~/image/pager/last_disabled.gif"; private const string prevenabledimgurl = "~/image/pager/prev.gif"; private const string prevdisabledimgurl = "~/image/pager/prev_disabled.gif"; private const string nextenabledimgurl = "~/image/pager/next.gif"; private const string nextdisabledimgurl = "~/image/pager/next_disabled.gif"; #endregion public bool SimplePager { set { this.tdAll.Visible = !value; this.tdCurrentIndex.Visible = !value; this.tdImgGo.Visible = !value; this.tdPageCount.Visible = !value; this.tdTextGo.Visible = !value; } } protected void Page_Load(object sender, EventArgs e) { } public int RecordCount { get { return (ViewState["RecordCount"] != null) ? (int)ViewState["RecordCount"] : 0; } set { ViewState["RecordCount"] = value; } } public int PageSize { get { if (string.IsNullOrEmpty(hidPageSize.Value) ||Convert.ToInt32( hidPageSize.Value)<=0) hidPageSize.Value = "20"; return int.Parse(hidPageSize.Value); } set { hidPageSize.Value = value.ToString(); } } public int CurrentPageIndex { get { return (hidCurrentPageIndex.Value == string.Empty) ? 0 : int.Parse(hidCurrentPageIndex.Value); } set { hidCurrentPageIndex.Value = value.ToString(); } } public void LoadData() { if (InitLoadData != null) { InitLoadData(); ShowStatus(0); } } public void ReLoadData() { if (BeforePageing != null) { BeforePageing(); } if (PageingLoadData != null) { PageingLoadData(); ShowStatus(CurrentPageIndex); } if (AfterPageing != null) { AfterPageing(); } } private void ShowStatus(int currentPageIndex) { int pageCount = Convert.ToInt32((RecordCount - 1) / PageSize + 1); lblRecordCount.Text = RecordCount.ToString(); hidCurrentPageIndex.Value = currentPageIndex.ToString(); if (RecordCount == 0) { lblPageCount.Text = "0"; lblCurrentPageIndex.Text = ""; } else { lblPageCount.Text = pageCount.ToString(); lblCurrentPageIndex.Text = Convert.ToString(currentPageIndex + 1); } if (pageCount == 0 || ((currentPageIndex + 1) == 1 && pageCount == 1)) { imgFirstPage.Enabled = false; imgPrePage.Enabled = false; imgNextPage.Enabled = false; imgLastPage.Enabled = false; } else { if (currentPageIndex == 0) { imgPrePage.Enabled = false; imgFirstPage.Enabled = false; imgNextPage.Enabled = true; imgLastPage.Enabled = true; } else if ((currentPageIndex + 1) == pageCount) { imgFirstPage.Enabled = true; imgPrePage.Enabled = true; imgNextPage.Enabled = false; imgLastPage.Enabled = false; } else if (currentPageIndex != 0 && (currentPageIndex + 1) != pageCount) { imgFirstPage.Enabled = true; imgPrePage.Enabled = true; imgNextPage.Enabled = true; imgLastPage.Enabled = true; } } } protected void imgFirstPage_Click(object sender, EventArgs e) { if (BeforePageing != null) { BeforePageing(); } if (PageingLoadData != null) { CurrentPageIndex = 0; PageingLoadData(); ShowStatus(CurrentPageIndex); } if (AfterPageing != null) { AfterPageing(); } } protected void imgPrePage_Click(object sender, EventArgs e) { if (BeforePageing != null) { BeforePageing(); } if (PageingLoadData != null) { CurrentPageIndex = CurrentPageIndex - 1; PageingLoadData(); ShowStatus(CurrentPageIndex); } if (AfterPageing != null) { AfterPageing(); } } protected void imgNextPage_Click(object sender, EventArgs e) { if (BeforePageing != null) { BeforePageing(); } if (PageingLoadData != null) { CurrentPageIndex = CurrentPageIndex + 1; PageingLoadData(); ShowStatus(CurrentPageIndex); } if (AfterPageing != null) { AfterPageing(); } } protected void imgLastPage_Click(object sender, EventArgs e) { if (BeforePageing != null) { BeforePageing(); } if (PageingLoadData != null) { CurrentPageIndex = Convert.ToInt32((RecordCount - 1) / PageSize + 1) - 1; PageingLoadData(); ShowStatus(CurrentPageIndex); } if (AfterPageing != null) { AfterPageing(); } } public void All_Click(object sender, EventArgs e) { if (BeforePageing != null) { BeforePageing(); } if (PageingLoadData != null) { CurrentPageIndex = 0; if (RecordCount > 0) PageSize = Convert.ToInt32(RecordCount); PageingLoadData(); ShowStatus(CurrentPageIndex); } if (AfterPageing != null) { AfterPageing(); } } protected void imgGo_Click(object sender, EventArgs e) { if (BeforePageing != null) { BeforePageing(); } if (PageingLoadData != null) { int pageCount = Convert.ToInt32((RecordCount - 1) / PageSize + 1); int goPageIndex= ConvertToInt(this.txtGo.Text.Trim()); if (pageCount >= goPageIndex) { CurrentPageIndex = goPageIndex - 1; PageingLoadData(); ShowStatus(CurrentPageIndex); } } if (AfterPageing != null) { AfterPageing(); } } private int ConvertToInt(string p) { int refvalue = 0; try { refvalue = int.Parse(p); } catch (Exception) { } return refvalue; } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); this.Page.ClientScript.RegisterHiddenField("hidTextBoxGoClientID", this.txtGo.ClientID); } }
测试页面前台代码:
<div> <asp:GridView ID="GridView1" CssClass="GridViewStyle" runat="server" BorderWidth="0px" CellPadding="0" AutoGenerateColumns="False" Width="100%" AllowSorting="True" EmptyDataText="暂无数据"> <FooterStyle CssClass="GridViewFooterStyle" /> <RowStyle CssClass="GridViewRowStyle" BackColor="#F7FAFD" /> <Columns> <asp:BoundField DataField="ID" HeaderText="ID"> <FooterStyle CssClass="hide" /> <HeaderStyle CssClass="hide" /> <ItemStyle CssClass="hide" /> </asp:BoundField> <asp:TemplateField HeaderText="序号"> <ItemTemplate> <%#Container.DataItemIndex+1%> </ItemTemplate> </asp:TemplateField> <asp:BoundField HeaderText="ID" DataField="ID" /> <asp:BoundField HeaderText="PID" DataField="PID" /> <asp:BoundField HeaderText="name" DataField="name" /> <asp:BoundField HeaderText="开挖面积" DataField="GROUPNAME" /> </Columns> <HeaderStyle CssClass="GridViewHeaderStyle" HorizontalAlign="Left" /> <AlternatingRowStyle BackColor="#EBF4FA" /> </asp:GridView> <div style="text-align: center;"> <center> <crc:Pager runat="server" ID="uxPager" OnInitLoadData="uxPager_InitLoadData" OnPageingLoadData="uxPager_PageingLoadData" /> </center> </div> </div>
测试页面后台代码;
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindGridProject("select * from student"); } } private void BindGridProject(string sql) { ViewState["sql"] = sql; this.uxPager.PageSize = Convert.ToInt32(ConfigurationManager.AppSettings["PageSize"]); this.uxPager.LoadData(); } #region 分页相关 /// <summary> /// 初始化分页控件 /// </summary> protected void uxPager_InitLoadData() { int totalRecords = -1; DataTable table = QueryTable(this.uxPager.CurrentPageIndex, this.uxPager.PageSize, ref totalRecords); this.uxPager.RecordCount = totalRecords; LoadGridView(table); } /// <summary> /// 加载分页控件 /// </summary> protected void uxPager_PageingLoadData() { int totalRecord = this.uxPager.RecordCount; DataTable table = QueryTable(this.uxPager.CurrentPageIndex, this.uxPager.PageSize, ref totalRecord); LoadGridView(table); } /// <summary> /// 获取数据源 /// </summary> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <param name="totalRecord">总页数</param> /// <returns></returns> public DataTable QueryTable(int pageIndex, int pageSize, ref int totalRecord) { OracleDataBase odb = new OracleDataBase("0"); string sql = ViewState["sql"].ToString(); totalRecord = odb.GetDataSet(sql).Tables[0].Rows.Count; string sqlTableName = sql; string selectSql = StructurePagingSql(sqlTableName, pageIndex, pageSize, null); return odb.GetDataSet(selectSql).Tables[0]; } /// <summary> /// 分页语句 /// </summary> /// <param name="strSQL"></param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <param name="orderBy">排序</param> /// <returns></returns> public String StructurePagingSql(string sqlTableName, int pageIndex, int pageSize, string orderBy) { int startIndex = pageIndex * pageSize; int endIndex = startIndex + pageSize; StringBuilder selectSql = new StringBuilder(); selectSql.Append(string.Format(" SELECT * FROM (SELECT A.*, ROWNUM RN FROM ({0}) A ", sqlTableName)); selectSql.Append(string.Format(" WHERE ROWNUM <= {0} ) WHERE RN > {1} ", endIndex, startIndex)); return selectSql.ToString(); } private void LoadGridView(DataTable dt) { this.GridView1.DataSource = dt; GridView1.DataBind(); } #endregion