Repeater没有自带的分页功能,搜罗了一下发现AspNetPager.dll这个插件比较好用拿出来分享一下,老鸟勿喷
先来一张效果图
该插件的好处在这里就不多说了,直接上代码
(1)首先需要把AspNetPager.dll引用到项目中来
(2)Aspx代码
ASPX代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Demo.aspx.cs" Inherits="WebDiyer.Demo" %> <%@ Register Assembly="AspNetPager" Namespace="Wuqi.Webdiyer" TagPrefix="webdiyer" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <title>分页测试</title> <link href="Style/Pager.css" rel="stylesheet" type="text/css" /> <script type="text/javascript"> function CgColor(type, obj) { if (type == "click") { for (var i = 1; i < document.getElementById("list").rows.length; i++) { document.getElementById("list").rows[i].style.backgroundColor = ""; document.getElementById("list").rows[i].tag = false; } obj.style.backgroundColor = "#E1E9FD"; obj.tag = true; } else if (type == "over") { if (!obj.tag) { obj.style.backgroundColor = "#EEF2FB"; } } else if (type == "out") { if (!obj.tag) { obj.style.backgroundColor = ""; } } } </script> </head> <body> <form id="form1" runat="server"> <div> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <div style="border: 1px solid #CCC; padding: 5px; margin-top: 5px; margin-bottom: 5px;"> Order ID:<asp:DropDownList ID="DropDownList1" runat="server"> <asp:ListItem>>=</asp:ListItem> <asp:ListItem><=</asp:ListItem> <asp:ListItem>=</asp:ListItem> </asp:DropDownList> <asp:TextBox ID="tb_orderid" runat="server" Width="90px"></asp:TextBox> <asp:Button ID="btn_search" runat="server" OnClick="btn_search_Click" Text="Search" /> <asp:Button ID="btn_all" runat="server" OnClick="btn_all_Click" Text="Show All" Enabled="false" /> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="tb_orderid" Display="Dynamic" ErrorMessage="RequiredFieldValidator">必需</asp:RequiredFieldValidator> <asp:CompareValidator ID="CompareValidator1" runat="server" ControlToValidate="tb_orderid" Display="Dynamic" ErrorMessage="CompareValidator" Operator="DataTypeCheck" SetFocusOnError="True" Type="Integer">必须是整数</asp:CompareValidator> </div> <div style="height:450px"> <asp:Repeater ID="rpRuleList" runat="server"> <HeaderTemplate> <table width="100%" border="1" cellspacing="0" cellpadding="4" style="border-collapse: collapse" id="list"> <tr> <th style="width: 5%"> 序号 </th> <th style="width: 10%"> 订单编号 </th> <th style="width: 15%"> 订单日期 </th> <th style="width: 30%"> 公司名称 </th> <th style="width: 20%"> 客户编号 </th> <th style="width: 20%"> 雇员姓名 </th> </tr> </HeaderTemplate> <ItemTemplate> <tr οnmοuseοver="CgColor('over',this)" οnmοuseοut="CgColor('out',this)" οnclick="CgColor('click',this)"> <td> <%#Eval("rowNumber")%> </td> <td> <%#Eval("orderid")%> </td> <td> <%#Eval("orderdate","{0:d}")%> </td> <td> <%#Eval("companyname")%> </td> <td> <%#Eval("customerid")%> </td> <td> <%#Eval("employeename")%> </td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater> </div> <webdiyer:AspNetPager ID="AspNetPager1" runat="server" PageSize="15" OnPageChanged="AspNetPager1_PageChanged" CssClass="cssPager" FirstPageText="首页" LastPageText="尾页" PrevPageText="上页" NextPageText="下页" HorizontalAlign="left" > </webdiyer:AspNetPager> </ContentTemplate> </asp:UpdatePanel> </div> </form> </body> </html>
(3)CS代码
CS代码
using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.SqlClient; namespace WebDiyer { public partial class Demo : System.Web.UI.Page { #region string count;//用于记录记录集条数 const string vsKey = " "; //ViewState key protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { searchOrders(string.Empty); } } protected void btn_search_Click(object sender, EventArgs e) { AspNetPager1.CurrentPageIndex = 1; btn_all.Enabled = true; string s = " orderid " + DropDownList1.SelectedValue + tb_orderid.Text; ViewState[vsKey] = s; searchOrders(s); } void searchOrders(string sWhere) { string pageIndex = (AspNetPager1.CurrentPageIndex ).ToString();//当前页码 DataTable dt = Common.DB.GetPage("V_Orders", "orderid,orderdate,customerid,CompanyName,EmployeeName ", pageIndex, sWhere, "orderid desc", "15", out count); AspNetPager1.RecordCount =Convert.ToInt32(count); rpRuleList.DataSource = dt; rpRuleList.DataBind(); } protected void AspNetPager1_PageChanged(object src, EventArgs e) { searchOrders((string)ViewState[vsKey]); } protected void btn_all_Click(object sender, EventArgs e) { ViewState[vsKey] = null; btn_all.Enabled = false; AspNetPager1.CurrentPageIndex = 1; searchOrders(null); } #endregion } }
(4)涉及到的存储过程
涉及到的分页存储过程
ALTER procedure [dbo].[GetPage] @tblName varchar(1000), -- 表名(必要参数) @Fields varchar(1000)='*', --要返回的列,要保证没有名称的列有别名 @PageSize int = 25, -- 页尺寸 @PageIndex int = 1, -- 页码 @OrderType varchar(50) = '', -- 设置排序类型,不要加order by @strWhere varchar(2000) = '' -- 查询条件 (注意: 不要加 where) as BEGIN declare @Mycount varchar(2000)---此变量存储SQL语句,用于获得符合条件的记录总数 declare @strSql varchar(2000)----此变量存储SQL语句,用于获得符合条件的记录 if @OrderType='' set @OrderType='getdate()' if(@strWhere='') begin set @Mycount='select count(*) from '+@tblName set @strsql='select * from (select top ('+cast(@PageSize*@PageIndex as varchar(10))+') ROW_NUMBER()over(order by '+@OrderType+') rowNumber,'+@Fields+' from '+@tblName+') t where rowNumber>'+cast((@PageIndex-1)*@PageSize as varchar(10)) end else begin set @Mycount='select count(*) from '+@tblName+' where '+@strWhere set @strsql='select * from (select top ('+cast(@PageSize*@PageIndex as varchar(10))+') ROW_NUMBER()over(order by '+@OrderType+') rowNumber,'+@Fields+' from '+@tblName+' where '+@strWhere+') t where rowNumber>'+cast((@PageIndex-1)*@PageSize as varchar(10)) end exec(@strSql) exec(@Mycount) END
到此一个基本的分页功能就完成了