效果演示如下:
具体的控件代码如下,在你的VS.Net里新建一个用户控件,然后把下面的代码拷贝进去就可以用了,最下面是使用示例:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
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;
using System.Text.RegularExpressions;
namespace MyTest
{
public partial class PageShow : System.Web.UI.UserControl
{
#region 私有成员
/// <summary>
/// 当前页的页码的背景色
/// </summary>
private string _color = "#a8ceff";
/// <summary>
/// 总记录数
/// </summary>
private int _recTotal = 0;
/// <summary>
/// 每页显示的记录数, 默认为10
/// </summary>
private int _pageSize = 10;
/// <summary>
/// 当前页的页码左右要显示的页码的个数, 默认7个
/// </summary>
private int _pageShowNum = 7;
#endregion
#region 公共属性
/// <summary>
/// 设置或读取总记录数,不能小于0
/// </summary>
public int RecTotal
{
get { return _recTotal; }
set
{
if (value > 0)
_recTotal = value;
}
}
/// <summary>
/// 设置或读取每页显示的记录数,不能小于0
/// </summary>
public int PageSize
{
get { return _pageSize; }
set
{
if (value > 0)
_pageSize = value;
}
}
/// <summary>
/// 读取总页数
/// </summary>
public int PageTotal
{
get {
int total = (int)Math.Ceiling((double)_recTotal / _pageSize);
return total;
//return PageTotal;
}
}
/// <summary>
/// 读取当前要显示第几页,注:页码传递方式是Request.QueryString["page"]
/// </summary>
public int PageIndex
{
get
{
int pageIndex = 1;
string tmp = Request.QueryString["page"];
if (tmp != null && tmp != string.Empty)
{
if (tmp == "end")
pageIndex = PageTotal;
else
{
try
{
pageIndex = int.Parse(tmp);
if (pageIndex > PageTotal)
pageIndex = PageTotal;
else if (pageIndex < 1)
pageIndex = 1;
}
catch (Exception)
{
pageIndex = 1;
}
}
}
return pageIndex;
}
}
/// <summary>
/// 设置或读取当前页的页码的背景色,默认为#a8ceff
/// </summary>
public string Color
{
get { return _color; }
set { _color = value; }
}
/// <summary>
/// 当前页的页码左右要显示的页码的个数,默认7个
/// </summary>
public int PageShowNum
{
get { return _pageShowNum; }
set { _pageShowNum = value; }
}
#endregion
/// <summary>
/// 重写Render事件,发送生成的分页Url
/// </summary>
/// <param name="writer"></param>
protected override void Render(HtmlTextWriter writer)
{
if (PageTotal <= 1)
{//少于1页时,不显示
return;
}
StringBuilder writeStr = new StringBuilder();
#region 控件使用的CSS代码
writeStr.Append(@"
<style type='text/css'>.page_total {background-color: #F5FBFF; border: 1px solid #86B9D6; border-right: 0px solid #86B9D6; font-weight: bold; }
.page_pages {background-color: #F5FBFF; border: 1px solid #86B9D6; margin-right:1px; vertical-align: middle; font-weight: bold; }
.page_num {background-color: #FFFFFF; border: 1px solid #DEDEB8; margin-right:1px; vertical-align: middle; }
a:hover.page_num {background-color: #F5FBFF; border: 1px solid #86B9D6; text-decoration: none; }
.page_curpage { margin-right:1px; border: 1px solid #DEDEB8; vertical-align: middle; background-color: #FFFF80; color: #92A05A; font-weight: bold; }
.page_bar { margin: 1px 0px; clear: both; }
.page_bar a { float: left; padding: 1px 4px; font-size: 12px; text-decoration: none; }
.page_redirect { background-color: #FFFFFF; border: 1px solid #DEDEB8; margin-right:1px; font-size: 12px !important; font-size: 13px; }
a:hover.page_redirect { background-color: #F5FBFF; border: 1px solid #86B9D6; text-decoration: none; }
</style>");
#endregion
writeStr.Append("<table cellspacing='0' cellpadding='0' align='left' style='clear: both;'>");
writeStr.Append("<tr><td valign='bottom'>");
writeStr.Append("<div class='page_bar'>");
writeStr.Append("<a class='page_total' title='记录总数'> " + _recTotal.ToString() + " </a>");
writeStr.Append("<a class='page_pages' title='当前页/总页数'> " + PageIndex + "/" + PageTotal + " </a>");
string url = GetUrl().ToLower();//取得当前页面的完整URL
string tmp;
//没有page时,加一个page, 方便后面替换
if (url.IndexOf("page=") < 0)
{
url = url + ((url.IndexOf("?") < 0) ? "?" : "&") + "page=1";
}
//设定正则表达式,用于替换url中的page=字符串
Regex my = new Regex(@"(page=[0-9]*(end)*)", RegexOptions.IgnoreCase);
#region 如果当前是指定显示个数的页码之后的页时,加上到第一页和上一页的链接(此时页面不会显示页码1)
if (PageIndex > _pageShowNum + 1)
{
//第一页
tmp = my.Replace(url, "page=1");
writeStr.Append("<a class='page_redirect' href='" + tmp + "' title='第一页'>|<</a>");
//上一页
tmp = my.Replace(url, "page=" + (PageIndex - 1).ToString());
writeStr.Append("<a class='page_redirect' href='" + tmp + "' title='上一页'><</a>");
}
#endregion
//总共显示( _pageShowNum * 2 + 1 )页的链接,从当前页往前_pageShowNum页,往前不足_pageShowNum页时,后面的页数增加.
int countPage = 0;//用于统计是否超过( _pageShowNum * 2 + 1 )页
int loopStart;
//当总页数大于( _pageShowNum * 2 + 1 ),且当前页为最后_pageShowNum页时,保持页面页码数不少于( _pageShowNum * 2 + 1 )
if (PageTotal - PageIndex >= _pageShowNum)
{
// 总页数 减 当前页码 大于等于左边要显示的个数时,循环 从当前页码 大于等于左边要显示的个数 开始
loopStart = PageIndex - _pageShowNum;
}
else
{
loopStart = PageTotal - _pageShowNum * 2;// PageIndex - _pageShowNum - (_pageShowNum - PageTotal + PageIndex) ==> PageTotal - _pageShowNum * 2
}
for (int loop = loopStart; loop <= PageTotal; loop++)
{
if (loop < 1)
continue;
else
countPage++;
#region 已经显示了( _pageShowNum * 2 + 1 )页 并且 当前页数小于等于总页数时,加上到最末页和上一页的链接并退出循环(不会显示最后1页的页码时)
if (countPage > (_pageShowNum * 2 + 1) && loop <= PageTotal)
{
//下一页
tmp = my.Replace(url, "page=" + (PageIndex + 1).ToString());
writeStr.Append("<a class='page_redirect' href='" + tmp + "' title='下一页'>></a>");
//最终页
tmp = my.Replace(url, "page=" + PageTotal.ToString());// my.Replace(url, "page=end");
writeStr.Append("<a class='page_redirect' href='" + tmp + "' title='最末页'>>|</a>");
break;
}
#endregion
#region 添加当前循环页的链接
if (loop == PageIndex)
{//当前页
writeStr.Append("<a class='page_curpage' style='background-color:" + _color + "'>" +
loop.ToString() + "</a>");// style='width:" + (loop > 99 ? (width + 5).ToString() : width.ToString()) + "px;'
}
else
{
//计算下一页的链接
tmp = my.Replace(url, "page=" + loop.ToString());
writeStr.Append("<a class='page_num' href='" + tmp + "' title='第" +
loop.ToString() + "页''>" + loop.ToString() + "</a>");
}
#endregion
}
writeStr.Append("</div></td></tr></table>");
writer.Write(writeStr.ToString());
}
/// <summary>
/// 获取当前页面的完整URL地址信息
/// </summary>
/// <returns></returns>
public string GetUrl()
{
string url;
url = System.Web.HttpContext.Current.Request.ServerVariables["SERVER_NAME"];
if (System.Web.HttpContext.Current.Request.ServerVariables["SERVER_PORT"] != "80")
url += ":" + System.Web.HttpContext.Current.Request.ServerVariables["SERVER_PORT"];
//strTemp = strTemp & CheckStr(Request.ServerVariables("URL"))
url += System.Web.HttpContext.Current.Request.ServerVariables["SCRIPT_NAME"];
if (!(System.Web.HttpContext.Current.Request.QueryString == null || System.Web.HttpContext.Current.Request.QueryString.ToString() == ""))
{
url += "?" + System.Web.HttpContext.Current.Request.QueryString.ToString();
}
string https = System.Web.HttpContext.Current.Request.ServerVariables["HTTPS"];
if (https == null || https == string.Empty || https == "off")
{
url = "http://" + url;
}
else
{
url = "https://" + url;
}
return url;
}
}
}
用法示例(假设用户控件名为:PageShow.ascx),把下面的代码拷贝到一个aspx文件中,即可运行:
<%@ Page Language="C#" %>
<%@ Register Src="PageShow.ascx" TagName="PageShow" TagPrefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
<script type="text/C#" runat="server">
void Page_Load(object sender, EventArgs e)
{
// 创建一个DataTable,用作数据源,你应该是去数据库取数据了
System.Data.DataTable dt = new System.Data.DataTable();
dt.Columns.Add("a1");
for (int loop = 1; loop <= 1000; loop++)
{
System.Data.DataRow dr = dt.NewRow();
dt.Rows.Add(dr);
dr["a1"] = "aaa" + loop.ToString();
}
PageShow1.RecTotal = dt.Rows.Count; // 必需设定,否则不会显示, 设定记录总数
PageShow1.Color = "red"; // 可以不设, 设置当前页码的背景色,默认为#a8ceff
PageShow1.PageShowNum = 3; // 可以不设, 设置当前页的页码左右要显示的页码的个数,默认7个
PageShow1.PageSize = 6; // 可以不设, 设置每页显示的记录数,默认10条
// 开始分页,绑定到页面上的Repeater
System.Web.UI.WebControls.PagedDataSource pgd = new PagedDataSource();
pgd.DataSource = dt.DefaultView;
pgd.CurrentPageIndex = PageShow1.PageIndex - 1; // 设置PagedDataSource当前显示第几页,注意减1
pgd.PageSize = PageShow1.PageSize; // 设置PagedDataSource每页显示的记录数,默认10条
pgd.AllowPaging = true;
Repeater1.DataSource = pgd;
Repeater1.DataBind();
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<uc1:PageShow ID="PageShow1" runat="server" />
<br />
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<br />
<%# DataBinder.Eval(Container.DataItem, "a1")%>
</ItemTemplate>
</asp:Repeater>
<br />
</div>
</form>
</body>
</html>