首页 > 技术文章 > AspNetPager使用指南

itjeff 2016-08-09 15:44 原文

一、AspNetPager支持两种方式分页:
一种是PostBack方式分页,
一种是通过Url来实现分页以及Url重写功能
二、AspNetPager支持各种数据绑定控件GridView、DataGrid、DataList、Repeater以及自定义的数据绑定控件的分页功能十分强大。
三、AspNetPager分页控件本身并不显示任何数据,而只显示分页导航元素,数据在页面上的显示方式与该控件无关,所以需要手写数据连接方法来配合,
四、结合TOP 。。。NOT IN 的通用存储过程分页方法使用AspNetPager十分实用

测试控件datalist aspnetpager 的分页方法示例   分页方法为 PostBack 方式
1、 首先将AspNetPager.dll复制于应用程序下的bin目录,打开解决方案,引入dll文件
2、 在工具栏中添加控件,这样可以支持拖拽使用
3、  要使用AspNetPager 要为其设置最基本的属性
使用 SqlServer Northwind数据库的 Products表
protected Wuqi.Webdiyer.AspNetPager AspNetPager1;
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.DataList DataList1;
private void Page_Load(object sender, System.EventArgs e)
{
       this.AspNetPager1.PageSize=10;     //设置每也显示的记录条数
       if(!IsPostBack)                       //只在页面第一次加载时起作用
       {
              SqlDBManager db = new SqlDBManager(System.Configuration.ConfigurationSettings.AppSettings["SqlConnectionString"]);
              AspNetPager1.RecordCount=db.CountPage("products");//获得要使用表的记录总数
                                                                                             //db.CountItems自定义的方法
              this.BindData();                                  
       }
}
private void BindData()
{
       SqlDBManager db= new SqlDBManager(System.Configuration.ConfigurationSettings.AppSettings["SqlConnectionString"].ToString();
       DataList1.DataSource=db.FenPage(this.AspNetPager1.PageSize,this.AspNetPager1.CurrentPageIndex,"productid","products","productid,productname,unitprice,unitsinstock","");
//自定义方法由 TOP not in 存储过程分页方法改编
       this.DataList1.DataBind();                //控件数据绑定
       this.Label1.Text="当前第"+this.AspNetPager1.CurrentPageIndex+"页 总"+this.AspNetPager1.PageCount+"页";
}
private void AspNetPager1_PageChanged(object sender, System.EventArgs e)
{       //页索引改变方法
    this.BindData();
}

设计页效果
<asp:DataList id="DataList1" style="Z-INDEX: 101; LEFT: 296px; POSITION: absolute; TOP: 96px" runat="server">
       <HeaderTemplate>
              <table border='1'>
                     <tr>
                            <td>产品ID</td>
                            <td>产品名称</td>
                            <td>产品数量</td>
                            <td>产品单价</td>
                     </tr>
       </HeaderTemplate>
       <FooterTemplate>
              </table>
</FooterTemplate>
       <ItemTemplate>
              <tr>
                            <td><%# DataBinder.Eval(Container.DataItem,"Productid")%></td>
                          <td><%# DataBinder.Eval(Container.DataItem,"productname")%></td>
                            <td><%# DataBinder.Eval(Container.DataItem,"unitprice")%></td>
                            <td><%# DataBinder.Eval(Container.DataItem,"unitsinstock")%></td>
                     </tr>
       </ItemTemplate>
</asp:DataList>
<webdiyer:AspNetPager id="AspNetPager1" style="Z-INDEX: 102; LEFT: 256px; POSITION: absolute; TOP: 40px" runat="server" Width="500px" FirstPageText="首页" LastPageText="尾页" NextPageText="下一页" PrevPageText="上一页" Height="40px" NumericButt PagingButt ShowNavigati ShowInputBox="Always" TextAfterInputBox="页" TextBeforeInputBox="跳转到第" AlwaysShow="True">
</webdiyer:AspNetPager>
<asp:Label id="Label1" style="Z-INDEX: 103; LEFT: 120px; POSITION: absolute; TOP: 56px" runat="server">Label</asp:Label> 

 

以下是我的项目中的可用部分:

private void BindData()
        {
            var pagesize = pager.PageSize;
            var sort = "id desc";
            int total;

            var sb = new StringBuilder();
            sb.Append(this.BuildQueryCondition());
            var strWhere = sb.ToString();
            var dao = new OrderInPerDayByUseInfoLogic();
            if (BuildSPQueryCondition() != glbWhere)
            {
                dao.getOrderInPerDayByUseInfo(this.tbStartDate.Text.Trim(), this.tbEndDate.Text.Trim(), this.tbCouponCnt.Text.Trim(), this.tbOrderCnt.Text.Trim());
                glbWhere = this.BuildSPQueryCondition();
            }
            var list = dao.PageQueryList(pager.CurrentPageIndex, pagesize, sort, strWhere, out total);
            rptBill.DataSource = list;
            rptBill.DataBind();
            pager.RecordCount = total;
        }

 

public virtual List<T> PageQueryList(int page, int pageSize,
            string sort, string where, out int total)
        {
            var viewName = typeof(T).Name;
            var paras = new List<SqlParameter>
                                {
                                    new SqlParameter("tblName", "dbo."+viewName),
                                    new SqlParameter("fldName", "*"),
                                    new SqlParameter("pageSize", pageSize),
                                    new SqlParameter("page", page),
                                    new SqlParameter("fldSort", sort),
                                    new SqlParameter("strCondition", where),
                                    new SqlParameter("pageCount", SqlDbType.Int){Direction = ParameterDirection.Output},
                                };
            var countParameter = new SqlParameter
            {
                ParameterName = "counts",
                SqlDbType = SqlDbType.Int,
                Direction = ParameterDirection.Output
            };
            var strParameter = new SqlParameter("strSql", SqlDbType.NVarChar, 4000) { Direction = ParameterDirection.Output };

            paras.Add(countParameter);
            paras.Add(strParameter);

            //var conn = _entities.Database.Connection.ConnectionString;
            //var ds = SqlHelper.ExecuteDataset(conn, CommandType.StoredProcedure,
            //                                  "dbo.PagedQuery", paras.ToArray());
            //total = countParameter.Value == DBNull.Value ? 0 : Convert.ToInt32(countParameter.Value);
            var ret =_entities.Database.SqlQuery<T>(
                "dbo.PagedQuery @tblName,@fldName,@pageSize,@page,@fldSort,@strCondition,@pageCount out,@counts out,@strSql out",
                paras.ToArray()).ToList();
            total = countParameter.Value == DBNull.Value ? 0 : Convert.ToInt32(countParameter.Value);
            return ret;
        }

 

ALTER PROCEDURE [dbo].[PagedQuery]
(
@tblName     nvarchar(200),        ----要显示的表或多个表的连接
@fldName     nvarchar(500) = '*',    ----要显示的字段列表
@pageSize    int = 10,        ----每页显示的记录个数
@page        int = 1,        ----要显示那一页的记录
@fldSort    nvarchar(200) = null,    ----排序字段列表或条件
--@Sort        bit = 0,        ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')
@strCondition    nvarchar(max) = null,    ----查询条件,不需where,以And开始
@pageCount    int = 1 output,            ----查询结果分页后的总页数
@Counts    int = 1 output,                ----查询到的记录数
@strSql          nvarchar(max) = '' output  -----最后返回的SQL语句
)
AS
SET NOCOUNT ON
--Declare @sqlTmp nvarchar(max)        ----存放动态生成的SQL语句
Declare @strTmp nvarchar(max)        ----存放取得查询结果总数的查询语句

if @strCondition is null
set @strCondition=''
--------生成查询语句--------
--此处@strTmp为取得查询结果数量的语句
set @strTmp='select @Counts=count(1) FROM '+@tblName + ' where (1>0) ' + @strCondition
----取得查询结果总数量-----
exec sp_executesql @strTmp,N'@Counts int out ',@Counts out
declare @tmpCounts int
if @Counts = 0
    set @tmpCounts = 1
else
    set @tmpCounts = @Counts
    --取得分页总数
    set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize
    /**//**当前页大于总页数 取最后一页**/
    if @page>@pageCount
        set @page=@pageCount
    else IF @page<1
  set @page=1
    --/*-----数据分页2分处理-------*/
    declare @pageIndex int --总数/页大小
    declare @lastcount int --总数%页大小
    set @pageIndex = @tmpCounts/@pageSize
    set @lastcount = @tmpCounts%@pageSize
    if @lastcount > 0
        set @pageIndex = @pageIndex + 1
    --else
    --    set @lastcount = @pagesize
       
    declare @startIndex int
    declare @endIndex int
    set @startIndex=(@page-1)*@pageSize+1;
    IF @page=@pageIndex
  set @endIndex=@tmpCounts
 else
  set @endIndex=@page*@pageSize
   
    if @page=1   --前半部分数据处理
        begin
            set @strTmp='select top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
     +' where (1>0) '+@strCondition
                    +' order by '+ @fldSort
        end
    else
        begin
   set @strTmp='with cte as ('+
     ' select '+@fldName+',row_number() over(order by '+@fldSort+') as _rn from '+@tblName+
     ' where (1>0) '+@strCondition+
     ')'+
     ' select '+@fldName+' from cte'+
     ' where _rn>='+cast(@startIndex as varchar(10))+' and _rn<='+cast(@endIndex as varchar(10));
  end
------返回查询结果-----
set @strSql = @strTmp
exec sp_executesql @strTmp
--print @strTmp

 

推荐阅读