特性: 、支持datagrid,datalist等分种数据显示控件,理论上只要有datasource的控件都可以 、支持url方式分页,url分页的每一页都可以被搜索引擎搜到,并且支持url重写 、控件样式可自定义 、封装完全,使用过程序只需写一行代码
复制代码 代码如下: /****************************************************************** ** 文件名:Pager.cs ** 创建人:杨响武 ** 日 期:2005年7月27日 ** 修改人: ** 日 期: ** 描 述: ** **---------------------------------------------------------------- ******************************************************************/
using System; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Web; using System.Web.UI; using System.Text.RegularExpressions;
namespace MyCompany.Controls { /// <summary> /// 分页控件 /// </summary> public class Pager : Label, INamingContainer { #region 成员变量和构造函数 HttpContext context = HttpContext.Current; Label countLabel; HyperLink previousButton; HyperLink nextButton; HyperLink firstButton; HyperLink lastButton; HyperLink[] pagingLinkButtons;
public override ControlCollection Controls { get { EnsureChildControls(); return base.Controls; } }
protected override void CreateChildControls() { Controls.Clear();
AddCountLabel();
AddPageButtons();
AddPreviousNextHyperLinks();
AddFirstLastHyperLinks(); } #endregion
#region 呈现方法 protected override void Render(HtmlTextWriter writer) { // 修改总页数小于等于1的时候不呈现任何控件 // int totalPages = CalculateTotalPages(); // // if (totalPages <= 1) // return;
AddAttributesToRender(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Class, this.CssClass, false);
RenderCountLabel(writer);
RenderFirst(writer);
RenderPrevious(writer);
RenderPagingButtons(writer);
RenderNext(writer);
RenderLast(writer); }
void RenderCountLabel(HtmlTextWriter writer) { countLabel.RenderControl(writer);
LiteralControl l = new LiteralControl(" "); l.RenderControl(writer); }
void RenderFirst (HtmlTextWriter writer) { firstButton.RenderControl(writer);
LiteralControl l = new LiteralControl(" "); l.RenderControl(writer); }
void RenderLast (HtmlTextWriter writer) { lastButton.RenderControl(writer);
LiteralControl l = new LiteralControl(" "); l.RenderControl(writer); }
void RenderPrevious (HtmlTextWriter writer) { previousButton.RenderControl(writer);
LiteralControl l = new LiteralControl(" "); l.RenderControl(writer); }
void RenderNext(HtmlTextWriter writer) { nextButton.RenderControl(writer);
LiteralControl l = new LiteralControl(" "); l.RenderControl(writer); }
private void RenderButtonRange(int start, int end, HtmlTextWriter writer) { for (int i = start; i < end; i++) { if (PageIndex == i) { Literal l = new Literal(); l.Text = "<font color =red>" + (i + 1).ToString() + "</font>";
l.RenderControl(writer); } else { pagingLinkButtons.RenderControl(writer); } if (i < (end - 1)) writer.Write(" "); }
LiteralControl l1 = new LiteralControl(" "); l1.RenderControl(writer); }
private void RenderPagingButtons(HtmlTextWriter writer) { int totalPages;
totalPages = CalculateTotalPages();
if (totalPages <= 10) { RenderButtonRange(0, totalPages, writer); } else { int lowerBound = (PageIndex - 4); int upperBount = (PageIndex + 6);
if (lowerBound <= 0) lowerBound = 0;
if (PageIndex <= 4) RenderButtonRange(0, 10, writer);
else if (PageIndex < (totalPages - 5)) RenderButtonRange(lowerBound, (PageIndex + 6), writer);
else if (PageIndex >= (totalPages - 5)) RenderButtonRange((totalPages - 10), totalPages, writer); } }
#endregion
#region 控件树方法 /// <summary> /// 信息标签 /// </summary> void AddCountLabel() { countLabel = new Label(); countLabel.ID = "countLabel"; countLabel.Text = string.Format(text, CalculateTotalPages().ToString("n0"));
Controls.Add(countLabel); }
private void AddPageButtons() { pagingLinkButtons = new HyperLink[CalculateTotalPages()];
for (int i = 0; i < pagingLinkButtons.Length; i++) { pagingLinkButtons = new HyperLink(); pagingLinkButtons.EnableViewState = false; pagingLinkButtons.Text = (i + 1).ToString(); pagingLinkButtons.ID = i.ToString(); pagingLinkButtons.CssClass = linkCss; pagingLinkButtons.NavigateUrl = GetHrefString(i);
Controls.Add(pagingLinkButtons); } }
/// <summary> /// 首页末页 /// </summary> void AddFirstLastHyperLinks() { firstButton = new HyperLink(); firstButton.ID = "First"; firstButton.Text = "首页"; if(PageIndex != 0 && CalculateTotalPages() > 0) { firstButton.NavigateUrl = GetHrefString(0); } else { firstButton.Enabled = false; }
Controls.Add(firstButton);
lastButton = new HyperLink(); lastButton.ID = "Last"; lastButton.Text = "末页"; if(PageIndex != CalculateTotalPages() - 1) { lastButton.NavigateUrl = GetHrefString(CalculateTotalPages() - 1); } else { lastButton.Enabled = false; } Controls.Add(lastButton); }
/// <summary> /// 上一页下一页 /// </summary> void AddPreviousNextHyperLinks() { previousButton = new HyperLink(); previousButton.ID = "Prev"; previousButton.Text = "上一页"; if (HasPrevious) { previousButton.NavigateUrl = GetHrefString(PageIndex - 1); } else { previousButton.Enabled = false; } Controls.Add(previousButton);
nextButton = new HyperLink(); nextButton.ID = "Next"; nextButton.Text = "下一页"; if(HasNext) { nextButton.NavigateUrl = GetHrefString(PageIndex + 1); } else { nextButton.Enabled = false; } Controls.Add(nextButton); } #endregion
#region 私有属性 private bool HasPrevious { get { if (PageIndex > 0) return true;
return false; } }
private bool HasNext { get { if (PageIndex + 1 < CalculateTotalPages() ) return true;
return false; } } #endregion
#region 帮助方法和公共属性
/// <summary> /// 获取分页导航按钮的超链接字符串 /// </summary> /// <param>该分页按钮相对应的页索引</param> /// <returns>分页导航按钮的超链接字符串</returns> private string GetHrefString(int pageIndex) { string url = Page.Request.RawUrl;
if (Regex.IsMatch(url, @"(d+).shtml", RegexOptions.IgnoreCase)) { url = Regex.Replace(url, @"(d+).shtml", pageIndex + ".shtml"); }
if (Regex.IsMatch(url, @"PageIndex=(d+)", RegexOptions.IgnoreCase)) { url = Regex.Replace(url, @"PageIndex=(d+)", "PageIndex=" + pageIndex.ToString()); }
return Page.Server.UrlPathEncode(url); }
public int CalculateTotalPages() { int totalPagesAvailable;
if (TotalRecords == 0) return 0;
totalPagesAvailable = TotalRecords / PageSize;
if ((TotalRecords % PageSize) > 0) totalPagesAvailable++;
return totalPagesAvailable; }
/// <summary> /// 当前页 /// </summary> public int PageIndex { get { int _pageIndex = 0;
if ((!Page.IsPostBack) && (context.PageIndex > 0)) _pageIndex = context.PageIndex; else _pageIndex = Convert.ToInt32(ViewState["PageIndex"]);
if (_pageIndex < 0) return 0; else { if (_pageIndex > CalculateTotalPages()-1) return CalculateTotalPages()-1; else return _pageIndex; } } set { ViewState["PageIndex"] = value; } }
/// <summary> /// 每页记录数 /// </summary> public int PageSize { get { int pageSize = Convert.ToInt32(ViewState["PageSize"]);
if (pageSize == 0) { return 10; }
return pageSize; } set { ViewState["PageSize"] = value; }
}
/// <summary> /// 总记录数 /// </summary> public int TotalRecords { get { return Convert.ToInt32(ViewState["TotalRecords"]); } set { ViewState["TotalRecords"] = value; } }
private string text = "共{0}页";
private string linkCss = ""; /// <summary> /// 链接样式 /// </summary> public string LinkCss { get { return linkCss; } set { linkCss = value;} }
private string textCss = ""; /// <summary> /// 文字样式 /// </summary> public string TextCss { get { return textCss; } set { textCss = value;} }
public string TextFormat { get { return text; } set { text = value; } }
#endregion } }
在页面上只需要向下面这样写:
复制代码 代码如下: (编辑:焦作站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|