分页控件,大家应该都比较熟悉了。但是一直以来分页控件都给我一个很郁闷的地方,几乎都是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种样式的命名我改了下。有几个样式带横线,我把横线去掉了。