做一个项目,用到了DATALIST,由于分页的需求,手动写了分页的函数。个人觉得GOOGLE的分页很不错,上网查了下资料,修改了下。
这里没有涉及到数据的分页读取,只是返回一个带HTML代码的分页样式(字符串),可以用label在页面显示,也可以用this.Controls.Add(new LiteralControl(string));方法加入到页面控件中。
Demo1:
using System; using System.Data; using System.Configuration; 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.Text; ////// Pagenumber 的摘要说明 /// public static class Pagenumber { ////// 创建并显示分页器 /// public static string BuildPager(int totalRecords, int currentPage, int pageSize, int pid) { int alter = 4; int startPage = 1; int endPage = currentPage + alter; int totalPages = CalculateTotalPages(totalRecords, pageSize); if (currentPage > alter) { startPage = currentPage - alter; } if (endPage > totalPages) { endPage = totalPages; } string strTemp = @" {2} "; StringBuilder sb = new StringBuilder(""); if (currentPage != startPage) { sb.Append(string.Format(strTemp, currentPage - 1, currentPage - 1, " 上一页 ")); } for (int i = startPage; i <= endPage; i++) { if (currentPage == i) { sb.Append(" " + i + " "); } else { sb.Append(string.Format(strTemp, i, i, "[" + i + "]")); } } if (currentPage != endPage) { sb.Append(string.Format(strTemp, currentPage + 1, currentPage + 1, " 下一页 ")); } return sb.ToString(); } /**/ ////// 计算总页数 /// /// 总记录数 /// 每页记录数 public static int CalculateTotalPages(int totalRecords, int pageSize) { int totalPagesAvailable; totalPagesAvailable = totalRecords / pageSize; // 由于C#的整形除法 会把所有余数舍入为0,所以需要判断是否需要加1 if ((totalRecords % pageSize) > 0) totalPagesAvailable++; return totalPagesAvailable; } }
Demo2:
/**/// 类似GOOGLE的分页函数,王传炜,资料参考http://www.phpx.com/happy/viewthread.php?tid=99280&extra=&page=2,谢谢YourEyes /// /// 总记录数 /// 每页记录数 /// 当前页数 /// Url参数 private string pagination(int total,int per,int page,string query_string) { int allpage=0; int next=0; int pre=0; int startcount=0; int endcount=0; string pagestr=""; if(page<1){page=1;} //计算总页数 if (per != 0) { allpage = (total / per); allpage = ((total % per) != 0 ? allpage + 1 : allpage); allpage = (allpage == 0 ? 1 : allpage); } next=page+1; pre=page-1; startcount=(page+5)>allpage?allpage-9:page-4;//中间页起始序号 //中间页终止序号 endcount = page<5 ? 10 : page+5; if(startcount<1) {startcount=1;} //为了避免输出的时候产生负数,设置如果小于1就从序号1开始 if(allpage1 ? "首页 上一页": "首页 上一页"; //中间页处理,这个增加时间复杂度,减小空间复杂度 for(int i=startcount;i<=endcount;i++) { pagestr+=page==i?" "+i+"":" "+ i +""; } pagestr+=page!=allpage ? " 下一页 末页" : " 下一页 末页"; return pagestr; }
如果再加上 分页存储过程 就可以满足大部分需求了。
一个分页存储过程
在这里整理了两个可以用的分页存储过程,以备后用。
第一:
ALTER procedure Consignment
@tablename varchar(80) ,
@strOrder varchar(50) ,
@PageIndex int = 1,
@PageSize int = 15,
@strGetFields varchar(200) = '*',
@OutPut int output
as
Begin
Declare @strSql varchar(500)
DECLARE @SQL NVARCHAR(1000)
DECLARE @R BIGINT
SET @SQL= N'select @R=count(*) from '+@TableName
EXEC SP_EXECUTESQL @SQL, N' @R BIGINT OUTPUT', @R OUTPUT
SET @OutPut= @R
if(@PageIndex =1)
Begin
set @strSql='select top '+str(@PageSize)+' '+@strGetFields+' from '+@tablename+' order by '+@strOrder
End
Else
set @strSql='select top '+str(@PageSize)+' '+@strGetFields+' from '+@tablename+' where ('+@strOrder
+' >= ( select Max('+@strOrder+') from ( select top '+str(@PageSize*@PageIndex)+' * from '+@tablename+' order by '
+@strOrder+' ) as tempTable)) order by '+ @strOrder
select @strSql
exec(@strSql)
End
第二:
alter procedure AllProce
@tablename varchar(200) , --表名
@strGetFields varchar(200) = '*', --查询列名
@PageIndex int = 1 , --页码
@pageSize int = 15, --页面大小
@strWhere varchar(100) = '', --查询条件
@strOrder varchar(100) = '', --排序列名
@intOrder bit = 0, --排序类型 1为升序
@CountAll bigint output --返回纪录总数用于计算页面数
as
begin
declare @strSql varchar(500) --主语句
declare @strTemp varchar(100) --临时变量
declare @strOrders varchar(50) --排序语句
declare @table varchar(70)
declare @SQL nvarchar(1000)
declare @R bigint
set @SQL= N'select @R=count(*) from '+convert(nvarchar(200),@TableName)
exec SP_EXECUTESQL @SQL, N' @R BIGINT OUTPUT', @R OUTPUT
set @CountAll= @R
if @intOrder = 0
begin
--为0是升序
set @strTemp = '>(select max'
set @strOrders = ' order by '+@strOrder+' asc '
end
else
begin
--否则为降序
set @strTemp = '<(select min'
set @strOrders = ' order by '+@strOrder+' desc '
end
if @PageIndex =1 --第一页直接读出纪录
begin
if @strWhere = ''
begin
set @strSql = 'select top '+str(@pageSize)+' '+@strGetFields+' from '+@tablename+' '+@strOrders
end
else
begin
set @strSql = 'select top '+str(@pageSize)+' '+@strGetFields+ ' from '+@tablename+' where '+@strWhere+' '+@strOrders
end
end
else
begin
set @strSql = 'select top'+str(@pageSize)+' '+@strGetFields+' from '+@tablename+' where '+@strOrder+' '+@strTemp+' ('+@strOrder+')'
+' from (select top '+str((@pageIndex-1)*@pageSize)+' '+@strGetFields+' from '+@tablename+ ' '+@strOrders+ ') as tempTable ) '+@strOrders
if @strWhere != ' '
begin
set @strSql = 'select top '+str(@pageSize)+ ' '+@strGetFields+' from '+@tablename+ ' where '+@strOrder+ ' '+@strTemp+' ('+@strOrder+') '
+' from(select top '+str((@pageIndex-1)*@pageSize)+' '+@strGetFields+' from '+@tablename+' where '+@strWhere+' ' +@strOrders+') as tempTable) where '+@strWhere+' '+@strOrders
end
end
exec(@strSql)
end
GO
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lcfgaoyong/archive/2006/04/20/670806.aspx