一写一个分页类 using System; using SystemText; using SystemDiagnostics; namespace Zhuwenfeng { public class MyPager { /// <summary> /// 总数据条数 /// </summary> public int TotalCount { get; set; } /// <summary> /// 每页数据条数 /// </summary> public int PageSize { get; set; } /// <summary> /// 当前页码(从开始) /// </summary> public int CurrentPageIndex { get; set; } /// <summary> /// 显示出来最多的页码数量因为假设有页不可能把页都显示到界面上 /// </summary> public int MaxPagerCount { get; set; } /// <summary> /// 页码链接的地址格式页码用{n}占位 /// </summary> public string UrlFormat { get; set; } public MyPager() { PageSize = ; MaxPagerCount = ; } /// <summary> /// 尝试从字符串pn中解析当前页面赋值给CurrentPageIndex /// </summary> /// <param name=pn></param> public void TryParseCurrentPageIndex(string pn) { int temp; if (intTryParse(pn out temp)) { CurrentPageIndex = temp; } else { CurrentPageIndex = ; } } /// <summary> /// 创建页码链接 /// </summary> /// <param name=i>页码</param> /// <param name=text>链接文本</param> /// <returns></returns> private string GetPageLink(int istring text) { StringBuilder sb = new StringBuilder() string url = UrlFormatReplace({n} iToString()) sbAppend(<a )Append(url)Append(>)Append(text)Append(</a>) return sbToString() } /// <summary> /// 检查输入参数 /// </summary> private void Check() { DebugAssert(PageSize>) DebugAssert(CurrentPageIndex >= ) DebugAssert(!stringIsNullOrEmpty(UrlFormat)) } /// <summary> ///渲染到前台到得HTML代码 /// </summary> /// <returns></returns> public string Render() { Check() StringBuilder sb = new StringBuilder() double tempCount = TotalCount / PageSize; int pageCount = (int)MathCeiling(tempCount) //计算显示的页码数(当总页码大于MaxPagerCount)的起始页码 int visibleStart = CurrentPageIndexMaxPagerCount/; if (visibleStart <) { visibleStart = ; } //计算显示的页码数(当总页码大于MaxPagerCount)的起始页码 int visibleEnd = visibleStart + MaxPagerCount; //显示最多MaxPagerCount条 //如果算出来的结束页码大于总页码的话则调整为最大页码 if (visibleEnd >pageCount) { visibleEnd = pageCount; } if (CurrentPageIndex > ) { sbAppend(GetPageLink( 首页)) sbAppend(GetPageLink(CurrentPageIndex 上一页)) } else { sbAppend(<span>首页</span>) //如果没有上一页了则只显示一个上一页的文字没有超链接 sbAppend(<span>上一页</span>) } //绘制可视的页码链接 for (int i = visibleStart; i <= visibleEnd; i++) { //当前页不是超链接 if (i == CurrentPageIndex) { sbAppend(<span>)Append(i)Append(</span>) } else { sbAppend(GetPageLink(iiToString())) } } if (CurrentPageIndex < pageCount) { sbAppend(GetPageLink(CurrentPageIndex + 下一页)) sbAppend(GetPageLink(pageCount + 末页)) } else { sbAppend(<span>下一页</span>) sbAppend(<span>末页</span>) } return sbToString() } } } 二UI层代码示例 public partial class 分页测试 : SystemWebUIPage { protected string PagerHTML { get; private set; } protected void Page_Load(object sender EventArgs e) { var pager = new MyPager() pagerUrlFormat = 分页测试aspx?pagenum={n}; pagerPageSize = ; pagerTryParseCurrentPageIndex(Request[pagenum]) int startRowIndex = (pagerCurrentPageIndex ) * pagerPageSize; so_KeywordLogBLL bll = new so_KeywordLogBLL() pagerTotalCount = bllGetTotalCount() RepeaterDataSource = bllGetPagedData(startRowIndex startRowIndex + pagerPageSize ) RepeaterDataBind() PagerHTML = pagerRender()//渲染页码条HTML } } 三前台代码 <form id=form runat=server> <div> <asp:Repeater ID=Repeater runat=server> <ItemTemplate> <li> <%#Eval(Id) %>|<%#Eval(KeyWord) %> </li> </ItemTemplate> </asp:Repeater> <div class=pager> <%=PagerHTML%> </div> </div> </form> 四加一个CSS更好看 <style type=text/css> pager { textalign: center; paddingbottom: px; paddingleft: px; paddingright: px; float: right; paddingtop: px; } pager a { borderbottom: #ccc px solid; textalign: left; borderleft: #ccc px solid; paddingbottom: px; lineheight: px; margin: px px; outlinestyle: none; paddingleft: px; paddingright: px; background: #fff; color: #; fontsize: px; bordertop: #ccc px solid; borderright: #ccc px solid; textdecoration: none; paddingtop: px; } pager a:hover { borderbottom: #f px solid; borderleft: #f px solid; color: #f; bordertop: #f px solid; borderright: #f px solid; textdecoration: underline; } pager a:focus { mozoutlinestyle: none; } pager span { borderbottomstyle: none; textalign: left; paddingbottom: px; lineheight: px; borderrightstyle: none; margin: px px; paddingleft: px; paddingright: px; bordertopstyle: none; background: #f; color: #fff; fontsize: px; borderleftstyle: none; paddingtop: px; } </style> 五再加一个数据访问层的Select代码 public int GetTotalCount() { string sql = SELECT count(*) FROM so_KeywordLog; return (int)DbHelperSQLGetSingle(sql) } public DataSet GetPagedData(int minrownum int maxrownum) { string sql = SELECT * from(SELECT *(row_number() over(order by Id)) rownum FROM so_KeywordLog) t where rownum>=@minrownum and rownum<=@maxrownum; SqlParameter[] parameters = { new SqlParameter(@minrownum SqlDbTypeInt ) new SqlParameter(@maxrownum SqlDbTypeInt ) }; parameters[]Value = minrownum; parameters[]Value = maxrownum; return DbHelperSQLQuery(sql parameters) } 六相关分页Select语句(扩展) 存储过程 create PROCEDURE GetPageDataOutRowPageCount ( @PageIndex int = 当前页数 @PageSize int = 每页大小 @RowCount int output总行数(传出参数) @PageCount int output总页数(传出参数) ) AS begin DECLARE @sql NVARCHAR()@sqlCount NVARCHAR() select @RowCount =COUNT(SID)@PageCount=CEILING((COUNT(SID)+)/@PageSize) FROM Students SET @sql=SELECT TOP +str(@PageSize) + FROM Students where SID not in(select top +str((@PageIndex)*@PageSize) + SID from Students) EXEC(@sql) end Select语句 select top + pageSize + * from Students where SID not in (select top + (pageIndex ) * intParse(pageSize) + SID from Students) Select语句 select * from (select * Row_Number()over(order by id) RowNumber from books) t where tRowNumber>= and tRowNumber<= 第n页 (PageIndex)*pageSize+PageIndex*pageSize ListView 提供的分页不说了 |