昨天在Q-Q群(居然会屏蔽,呵呵,就只有打横线了)里探讨了一下关于Page类重写的实现,知道了Asp.net框架结构的一些底层,呵呵收益很大,因为一直以来都没有系统学习过Asp.net,写的程序都是自己苦苦自学来的,不容易啊。
于是今天尽兴做完了一个分页控件(经常用到),网上找的很多分页控件都会在页面中产生乱码(ViweState),而我不太喜欢这个东东,减少或者没有乱码能提高网站在搜索引擎中的表现。
扯远了? 这里现附上代码,说明都在注释中,需要补充说明的在最下面:
1、打开VS(我使用的VS2008),新建一个项目(为了同步可以新建一个空的解决方案)命名为database的类库项目,在项目中添加一个UserPage.cs类,该类需要重写一个Render,用于将写入东西到控件中,当然,首先需要继承Control类。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web.UI; namespace database { public class UserPage : Control { /// <summary> /// 设置每一个页面显示的条数 /// </summary> public int EachPageItemCount=0; /// <summary> /// 设置当前页 /// </summary> public int CurrentPage=0; /// <summary> /// 设置总条目数 /// </summary> public int ItemCount = 0; /// <summary> /// 设置分页后的总页数 /// </summary> private int AllPageCount { get; set; } /// <summary> /// 设置第一页 /// </summary> private int FirstPage { get { return 1; } } /// <summary> /// 设置最后页 /// </summary> private int LastPage { get { return AllPageCount; } } /// <summary> /// 设置上一页 /// </summary> private int BackPage { get { return CurrentPage < 2 ? 1 : (CurrentPage - 1); } } /// <summary> /// 设置下一页 /// </summary> private int NextPage { get { return CurrentPage == AllPageCount ? AllPageCount : CurrentPage + 1; } } private int _PageNumber; /// <summary> /// 设置每一页显示的数字个数 必须大于0且为偶数 /// </summary> public int PageNumber { get { if (_PageNumber < 2) { return 0; } else if (_PageNumber % 2 != 0) { return _PageNumber - 1; } else { return _PageNumber; } } set { _PageNumber = value; } } private bool _IndexAndLastState = true; /// <summary> /// 是否显示首尾页 默认显示 /// </summary> public bool IndexAndLastState { get { return _IndexAndLastState; } set { _IndexAndLastState = value; } } private bool _NumberState = true; /// <summary> /// 是否显示数字分页 默认显示 /// </summary> public bool NumberState { get { return _NumberState; } set { _NumberState = value; } } private bool _PageInfoState = true; /// <summary> /// 是否显示分页信息(如页数 条数) /// </summary> public bool PageInfoState { get { return _PageInfoState; } set { _PageInfoState = value; } } /// <summary> /// 设置当前页面的Url /// </summary> public string PageUrl = ""; /// <summary> /// 重写Render方法 将需要信息写入html控件 /// </summary> /// <param name="writer"></param> protected override void Render(HtmlTextWriter writer) { if (ItemCount > EachPageItemCount) { AllPageCount = (ItemCount % EachPageItemCount) < 1 ? ItemCount / EachPageItemCount : (ItemCount / EachPageItemCount) + 1;//获取总页码数 } else { AllPageCount = 1; } int p = 0;/*页码(1 2 3 4 5.....)*/ string strText = string.Empty; for (int i = 1; i < PageNumber; i++) { if (CurrentPage <= (AllPageCount - PageNumber / 2)) { if (CurrentPage >= PageNumber / 2) { p = (CurrentPage + i) - PageNumber / 2; } else/*定义当当前页小于每页页码个数/2时同样显示出定义的页码个数*/ { int j = CurrentPage; p = CurrentPage + i - j; j++; } } else { int j = -1; p = AllPageCount - PageNumber + i - j; j++; } if (p > 0 && p <= AllPageCount) { if (p == CurrentPage) { strText += "<strong>" + p + "</strong>"; } else { strText += "<a href=\"" + PageUrl + p + "\">" + p + "</a>"; } } } StringBuilder sb = new StringBuilder(); if (IndexAndLastState) { sb.Append("<a href=\"" + PageUrl + FirstPage + "\" class=\"songti\"><<首页</a>"); } sb.Append("<a href=\"" + PageUrl + BackPage + "\" class=\"songti\"><上一页</a>"); if (NumberState) { sb.Append(strText); } sb.Append("<a href=\"" + PageUrl + NextPage + "\" class=\"songti\">下一页></a>"); if (IndexAndLastState) { sb.Append("<a href=\"" + PageUrl + LastPage + "\" class=\"songti\">尾页>></a>"); } if (PageInfoState) { sb.Append("<span>共" + AllPageCount + "页 " + ItemCount + "条信息</span>"); } writer.Write(sb); base.Render(writer); } } }?
?
2、在新建一个WEB项目,为了方便同步可以先添加对database的引用,也可以写完后直接在VS左侧中工具选项中添加Dll,在WEB项目中默认建立一个Default.aspx,里面放入Repeater控件用于数据的绑定,然后需要分页控件,在aspx页面的顶部加入
<%@ Register assembly="database" namespace="database" tagprefix="cc1" %>
具体的参数到网上找找说明,这里不概述,然后就是引用控件
<cc1:UserPage ID="MyPage" runat="server" PageNumber="8"></cc1:UserPage>
具体的呈现样式有三个状态可选(显示收尾、显示数字分页、显示页码信息),同时如果设置了显示数字分页则还需要设置分页的个数,这里必须是偶数,具体的逻辑请到用户控件代码中看。
然后就是对数据控件后台参数的设置,有4个参数,具体说明请看用户控件。
MyPage.ItemCount = strCount; MyPage.CurrentPage = int.Parse(Request["page"].ToString()); MyPage.EachPageItemCount = pageSize; MyPage.PageUrl = "Default.aspx?page=";
这个就是完整的分页了,当然,分页采用的是存储过程,基本思路是在存储过程中将当前页参数与每页显示的条数穿进去,采用TOP找到上一页下一页,这个脱离本篇的范畴了,可以到网上找存储过程分页,以后有空也单独特出来吧。
基本的思路是这样的,生成的代码全纯净,无任何乱码(当然,首先要将aspx页面中的form的ruanat="server"去掉),由于涉及到对表的操作,就不贴附件代码了,需要动手的地方还是多动手吧,呵呵