本来想写成自定义控件的,觉得麻烦,并且暂时没有太多的时间来弄这个。就偷懒,写了个用户控件将就用。
用户控件的html部分
<div style="text-align: right; height: 20px"> <table style="display: inline; float: right;"> <tr> <td style=" 35px"> <asp:LinkButton ID="BTN_First" runat="server" Text="首页" CommandArgument="First" OnClick="BTN_Pager_Click" /> </td> <td style=" 35px"> <asp:LinkButton ID="BTN_Pre" runat="server" Text="上页" CommandArgument="Pre" OnClick="BTN_Pager_Click" /> </td> <td style=" 35px"> <asp:LinkButton ID="BTN_Next" runat="server" Text="下页" CommandArgument="Next" OnClick="BTN_Pager_Click" /> </td> <td style=" 35px"> <asp:LinkButton ID="BTN_End" runat="server" Text="尾页" CommandArgument="End" OnClick="BTN_Pager_Click" /> </td> </tr> </table> <div style="float: right; margin-right: 10px;"> <asp:TextBox ID="TB_GoTo" runat="server" Width="25px"></asp:TextBox> <asp:Button ID="BTN_GoTo" runat="server" Text="跳" Height="25px" OnClick="BTN_GoTo_Click" /></div> <div style="float: right; margin-right: 10px;"> 当前是第<asp:Literal ID="L_PageIndex" Text="1" runat="server" />/<asp:Literal ID="L_PageCount" Text="0" runat="server" />页</div> <div style="float: right; margin-right: 10px;"> 共有<asp:Literal ID="L_RecordCount" Text="0" runat="server" />条记录</div> <div style="float: right; margin-right: 10px;"> 每页<asp:Literal ID="L_PageSize" Text="10" runat="server" />条记录</div> </div>
用户控件的后台部分。
定义了一个委托,调用外部根据数据源进行绑定数据的方法,以便在不同的分页应用到不同的场合。
namespace Fireice.Edo.Web.UserControl { public delegate void PagerDataTable(DataTable dt); public partial class Pager : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) BoundData(); DIV_Pager.Attributes.Add("style", _style); //text-align: right; margin-right:40px; margin-bottom:20px; height: 20px } public PagerDataTable PagerDataTableHander; public string TableName { get { if (ViewState["TableName"] == null) throw new Exception("没有指定表名"); else return ViewState["TableName"].ToString(); } set { ViewState["TableName"] = value; } } public string OrderField { get { if (ViewState["OrderField"] == null) throw new Exception("没有指定排序的字段"); return ViewState["OrderField"].ToString(); } set { ViewState["OrderField"] = value; } } public string WherePart { get { return ViewState["WherePart"] == null ? String.Empty : ViewState["WherePart"].ToString(); } set { ViewState["WherePart"] = value; } } public OrderDirect OrderDirect { get { if (ViewState["OrderDirect"] == null) return OrderDirect.ASC; return (OrderDirect)Enum.Parse(typeof(OrderDirect), ViewState["OrderDirect"].ToString()); } set { ViewState["OrderDirect"] = value; } } public DatabaseType DatabaseType { get { if (ViewState["DatabaseType"] == null) return DatabaseType.MySql; return (DatabaseType)Enum.Parse(typeof(DatabaseType), ViewState["DatabaseType"].ToString()); } set { ViewState["DatabaseType"] = value; } } private void BoundData() { string tableName = TableName; string orderField = OrderField; string orderDirect = OrderDirect.ToString(); Fireice.Edo.Helper.DB.DBHelper db = new Fireice.Edo.Helper.DB.DBHelper(); //db.GetDataTable(); int count = Convert.ToInt32(db.GetSingleFieldBySQL("select count(*) from " + tableName + " " + WherePart + " ")); RecordCount = count; PageCount = AccountPageCount(PageSize, RecordCount); string sql = String.Empty; switch (DatabaseType) { case DatabaseType.MySql: sql = " select * from " + tableName + " " + WherePart + " order by " + orderField + " " + orderDirect + " limit " + (PageIndex - 1) * PageSize + "," + PageSize + " "; break; case DatabaseType.SqlServer2000: sql = " SELECT TOP " + PageSize + " * FROM " + tableName + " WHERE (" + orderField + " NOT IN (SELECT TOP " + PageSize * (PageIndex - 1) + " " + orderField + " FROM " + tableName + " ORDER BY " + orderField + " " + orderDirect + ")) ORDER BY " + orderField + " " + orderDirect + " "; break; } DataTable dt = db.GetDataTable(sql); if (PagerDataTableHander != null) PagerDataTableHander(dt); //_gv.DataSource = dt; //_gv.DataBind(); } private void ControlState() { if (PageCount <= 1) { TB_GoTo.Enabled = false; BTN_GoTo.Enabled = false; } else { BTN_GoTo.Enabled = true; } if (PageIndex == 1 || PageIndex == 0) { BTN_First.Enabled = false; BTN_Pre.Enabled = false; } else { BTN_First.Enabled = true; BTN_Pre.Enabled = true; } if (PageIndex == PageCount) { BTN_Next.Enabled = false; BTN_End.Enabled = false; } else { BTN_Next.Enabled = true; BTN_End.Enabled = true; } } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); ControlState(); } /// <summary> /// 每页显示的记录数 /// </summary> public int PageSize { get { return Convert.ToInt32(L_PageSize.Text); } set { L_PageSize.Text = value.ToString(); } } /// <summary> /// 总记录数 /// </summary> public int RecordCount { get { return Convert.ToInt32(L_RecordCount.Text); } set { L_RecordCount.Text = value.ToString(); } } /// <summary> /// 当前是第几页 /// </summary> public int PageIndex { get { return Convert.ToInt32(L_PageIndex.Text); } set { L_PageIndex.Text = value.ToString(); } } /// <summary> /// 总页数 /// </summary> public int PageCount { get { return Convert.ToInt32(L_PageCount.Text); } set { L_PageCount.Text = value.ToString(); } } /// <summary> /// 根据总记录数和每页显示的页数计算出总页数 /// </summary> /// <param name="pageSize"></param> /// <param name="recordCount"></param> /// <returns></returns> private int AccountPageCount(int pageSize, int recordCount) { if (pageSize == 0 || recordCount == 0) return 0; else { if (recordCount % pageSize == 0) { return recordCount / pageSize; } else { return recordCount / pageSize + 1; } } } protected void BTN_Pager_Click(object sender, EventArgs e) { string command = ((LinkButton)sender).CommandArgument; switch (command) { case "First": { PageIndex = 1; break; } case "Pre": { PageIndex--; break; } case "Next": { PageIndex++; break; } case "End": { PageIndex = PageCount; break; } } BoundData(); } protected void BTN_GoTo_Click(object sender, EventArgs e) { string pageNumber = TB_GoTo.Text; int goToPageNumber = 0; bool check = true; check = Int32.TryParse(pageNumber, out goToPageNumber); if (goToPageNumber <= 0 || goToPageNumber > PageCount) { check = false; } if (check) { PageIndex = goToPageNumber; BoundData(); } else { string key = "PagerErrorkey"; if (!Page.ClientScript.IsStartupScriptRegistered(key)) { Page.ClientScript.RegisterStartupScript(this.GetType(), key, "alert('输入的跳转页数格式不正确或超出范围!');", true); } } } private string _style; public string Style { set { _style = value; } } } public enum OrderDirect { DESC, ASC } public enum DatabaseType { SqlServer2000, MySql } }
具体的使用如下:
protected void Page_Load(object sender, EventArgs e) { Pager1.TableName = "accessrecord"; Pager1.OrderDirect = Fireice.Edo.Web.UserControl.OrderDirect.DESC; Pager1.OrderField = "Recordtime"; Pager1.PageSize = 20; Pager1.Style = "text-align: right; margin-right:10px; margin-top:10px;margin-bottom:20px; height: 20px"; Pager1.DatabaseType = Fireice.Edo.Web.UserControl.DatabaseType.MySql; Pager1.PagerDataTableHander += new Fireice.Edo.Web.UserControl.PagerDataTable(BoundGV); } private void BoundGV(DataTable dt) { GridView1.DataSource = dt; GridView1.DataBind(); }