分页控件,大家应该都比较熟悉了。但是一直以来分页控件都给我一个很郁闷的地方,几乎都是URL传值,让人很郁闷。
如果我的是高级查询,里面的值有很多,那写死个人。同时对系统的请求也是一个考验。于是我写了这个分页控件。同时支持24种分页样式。
代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web.UI; using System.Web.UI.WebControls; using System.ComponentModel; using System.Web.UI.HtmlControls; namespace MyControl { [DefaultProperty("Text")] [ToolboxData("<{0}:DataPager runat=server></{0}:DataPager>")] public class DataPager : WebControl, INamingContainer, IPostBackEventHandler { public event EventHandler PagerOnclick { add { Events.AddHandler(this, value); } remove { Events.RemoveHandler(this, value); } } protected void _PagerClick(object sender, EventArgs e) { EventHandler hd = (EventHandler)base.Events[this]; if (hd != null) { hd(sender, e); } } public void RaisePostBackEvent(string Index) { //Label lbl = (Label)this.FindControl("lbl"); //lbl.Text += "自己的事件:" + Index; } void btn_Click(object sender, EventArgs e) { try { int pageIndex = int.Parse(((sender) as LinkButton).Text); this.PageIndex = pageIndex; _PagerClick(sender, e); } catch (Exception) { } } /// <summary> /// 当前页数 /// </summary> public int PageIndex { get { return int.Parse(ViewState["PageIndex"] == null ? "1" : ViewState["PageIndex"].ToString()); } set { ViewState["PageIndex"] = value; CreateChildControls(); } } /// <summary> /// 总的页数 /// </summary> public int TotalPage { get { return int.Parse(ViewState["TotalPage"] == null ? "1" : ViewState["TotalPage"].ToString()); } set { ViewState["TotalPage"] = value; } } /// <summary> /// 总的记录数 /// </summary> public int TotalRecord { get { return int.Parse(ViewState["TotalRecord"] == null ? "0" : ViewState["TotalRecord"].ToString()); } set { ViewState["TotalRecord"] = value; } } /// <summary> /// 每页数据大小 /// </summary> public int PageSize { get { return int.Parse(ViewState["PageSize"] == null ? "0" : ViewState["PageSize"].ToString()); } set { ViewState["PageSize"] = value; } } /// <summary> /// 自定义说明 /// </summary> public string CustomText { get { return ViewState["CustomText"] == null ? "" : ViewState["CustomText"].ToString(); } set { ViewState["CustomText"] = value; } } void NextPager(object send, EventArgs e) { this.PageIndex = this.PageIndex + 10 > this.TotalPage ? this.TotalPage : this.PageIndex + 10; } void PrePager(object send, EventArgs e) { this.PageIndex = this.PageIndex-10 > 1 ? this.PageIndex - 10 : 1; } void MaxPager(object send, EventArgs e) { this.PageIndex = this.TotalPage; } protected override void CreateChildControls() { this.Controls.Clear(); HtmlGenericControl div = new HtmlGenericControl("div"); div.Attributes.Add("class", "pagingbar"); this.Controls.Add(div); HtmlGenericControl divbadoo = new HtmlGenericControl("div"); divbadoo.Attributes.Add("class", _displayStyle); div.Controls.Add(divbadoo); int StarDisplayPage = PageIndex-4; int EndDisplayPage = PageIndex+5; if (PageIndex <= 5) { StarDisplayPage = 1; EndDisplayPage = 10; } if (PageIndex>5) { LinkButton labPrev = new LinkButton(); labPrev.Text = "< Prev"; labPrev.Click += PrePager; labPrev.CssClass = "disabled"; divbadoo.Controls.Add(labPrev); LinkButton button = new LinkButton(); button.Click += btn_Click; button.Text = "1"; divbadoo.Controls.Add(button); Label labMore = new Label(); labMore.Text = "..."; divbadoo.Controls.Add(labMore); } if (PageIndex >= TotalPage-5) { StarDisplayPage = (TotalPage - 10 <= 0) ? 1:TotalPage - 10; EndDisplayPage = TotalPage; } for (int i = StarDisplayPage; i <= EndDisplayPage; i++) { if (i == PageIndex) { Label labCurrent = new Label(); labCurrent.Text = i.ToString(); labCurrent.CssClass = "current"; divbadoo.Controls.Add(labCurrent); } else { LinkButton button = new LinkButton(); button.Click += btn_Click; button.Text = i.ToString(); divbadoo.Controls.Add(button); } } if (PageIndex < TotalPage - 5) { Label labOmission = new Label(); labOmission.Text = "..."; divbadoo.Controls.Add(labOmission); LinkButton btnLastPage = new LinkButton(); btnLastPage.Text = this.TotalPage.ToString(); btnLastPage.Click += btn_Click; divbadoo.Controls.Add(btnLastPage); LinkButton btnNextPage = new LinkButton(); btnNextPage.Text = "Next >"; btnNextPage.Click += NextPager; divbadoo.Controls.Add(btnNextPage); } } protected override void Render(HtmlTextWriter output) { if ((base.Site != null) && base.Site.DesignMode) { StringBuilder sb = new StringBuilder(); sb.Append("<div id=\"pagingbar\" class=\"pagingbar\">"); sb.Append("<div class=\"badoo\">"); sb.Append("<span class=\"disabled\">< Prev </span>"); sb.Append("<span class=\"current\">1</span>"); sb.Append("<a>2</a>"); sb.Append("<a>3</a>"); sb.Append("<a>4</a>"); sb.Append("<a>5</a>"); sb.Append("<a>6</a>"); sb.Append("<a>7</a>"); sb.Append("<a>8</a>"); sb.Append("<a>9</a>"); sb.Append("..."); sb.Append("<a>n</a>"); sb.Append("<a> Next ></a>"); sb.Append("</div>"); sb.Append("</div>"); output.Write(sb.ToString()); } else { base.Render(output); } } private string _displayStyle { get { return ViewState["DisplayStyle"] == null ? "badoo" : ViewState["DisplayStyle"].ToString(); } } /// <summary> /// 设置的样式 /// </summary> public DisplayStyle SelectDisplayStyle { set { if (ViewState["DisplayStyle"]==null) { ViewState["DisplayStyle"] = value.ToString(); } } } public string SetDisplayStyle { set { ViewState["DisplayStyle"] = value; } } public enum DisplayStyle { digg, yahoo, meneame, flickr, sabrosus, pagination, scott, quotes, black, black2, blackRed, grayr, yellow, jogger, starcraft2, tres, megas512, technorati, youtube, msdn, badoo, greenBlack, viciao, yahoo2, } } }
你可以选择手动或者自动输入样式,当两个样式都有的时候使用手动设置的样式。
同时,点击页数的事件 直接赋值 或者点击写都可以
前台调用代码如下:
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> <ContentTemplate> <cc1:DataPager ID="DataPager2" runat="server" SelectDisplayStyle="flickr" OnPagerOnclick="DataPager1_PagerOnclick1" /> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> </ContentTemplate> </asp:UpdatePanel>
CS代码:
protected void Page_Load(object sender, EventArgs e) { if(!IsPostBack) { //this.PagingBar1 = new MyControl.PagingBar(); this.DataPager1.PageIndex = 5; this.DataPager1.PageSize = 20; this.DataPager1.TotalPage = 30; this.DataPager1.TotalRecord = 500; this.DataPager2.PageIndex = 5; this.DataPager2.PageSize = 20; this.DataPager2.TotalPage = 30; this.DataPager2.TotalRecord = 500; //this.DataPager1. } } protected void DataPager1_PagerOnclick1(object sender, EventArgs e) { //int PageIndex = this.DataPager1.PageIndex; int strthisPage = DataPager2.PageIndex; //Convert.ToInt32(((sender) as LinkButton).Text); // this.DataPager1.PageIndex = strthisPage; Label1.Text = strthisPage.ToString(); }对了,24种样式的命名我改了下。有几个样式带横线,我把横线去掉了。