小巧精致的ASP.Net分页控件
2008-06-12 16:39
411 查看
效果演示如下:
具体的控件代码如下,在你的VS.Net里新建一个用户控件,然后把下面的代码拷贝进去就可以用了,最下面是使用示例:
具体的控件代码如下,在你的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>
相关文章推荐
- 小巧精致的ASP.Net分页控件
- asp.net mvc 分页控件 MvcPager修改;使用范围增大
- ASP.NET技巧:GridView控件自定义分页详解第三页
- 用DataList控件和ObjectDataSource在ASP.NET 2.0中实现高效能数据分页
- asp.net分页控件
- 公布本人自编的asp.net的分页控件
- asp.net 自定义分页控件
- C#分页代码,或许这个代码比Asp.Net分页和AspNetPager控件更好用
- asp.net mvc强大的分页控件MvcPager
- asp.net分页控件(c#)
- 创建用于 ASP.NET 的分页程序控件
- ASP.NET MVC分页控件MvcPager 1.5版发布
- 创建用于 ASP.NET 的分页程序控件
- ASP.NET 3.5's ListView and DataPager—Part4:利用ListView和DataPager控件来对数据分页
- asp.net 分页-自己写分页控件
- Asp.Net 分页显示控件
- asp.net分页控件AspNetPager的使用,使用传统分页和存储过程分页
- 一个ASP.NET的分页控件
- [转贴]创建用于ASP.NET的分页程序控件
- asp.net的分页代码 (不是分页控件)