昨天在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"去掉),由于涉及到对表的操作,就不贴附件代码了,需要动手的地方还是多动手吧,呵呵