插播个广告ASP.NET相关技术交流群205914059
废话少说源码写的时候思路很乱还有在整理希望多提意见。
using System; using System.Text; using System.Web.UI; using System.Web.UI.WebControls; using System.ComponentModel; using System.Text.RegularExpressions; using System.Data; namespace PagerControls { //首先解释一下这个类的继承规则,System.Web.UI.WebControls.WebControl就不说了;IPostBackEventHandler这个接口是用于点击翻页按钮时进行回发的。
public class DataPaging : System.Web.UI.WebControls.WebControl, IPostBackEventHandler { //定义翻页的按钮和相关标签
#region 子控件 private System.Web.UI.WebControls.LinkButton Upbtn = new LinkButton(); private System.Web.UI.WebControls.LinkButton NextBtn = new LinkButton(); private System.Web.UI.WebControls.LinkButton Fristbtn = new LinkButton(); private System.Web.UI.WebControls.LinkButton LastBtn = new LinkButton(); private System.Web.UI.WebControls.Button GoBtn = new Button(); private System.Web.UI.WebControls.TextBox LblSumPagestxt = new TextBox(); private System.Web.UI.WebControls.Label LblPageInfo = new Label(); //private System.Web.UI.WebControls.Label LblPageIndexstxt = new Label(); //private System.Web.UI.WebControls.Label LblSumPages = new Label(); //private System.Web.UI.WebControls.Label LblPageIndexs = new Label(); #endregion //这个是用于外部设置的开发属性
#region 控件属性 [Bindable(true)] [Category("分页属性区")] [Browsable(true)] [Description("每页显示记录数")] [DefaultValue("5")] public int PageSizes { get { return ViewState["PageSizes"] == null ? 5 : int.Parse(ViewState["PageSizes"].ToString()); } set { ViewState["PageSizes"] = value; } } [Bindable(true)] [Category("分页属性区")] [Browsable(true)] [Description("DataTable数据集")] public DataTable DataSource { get { return ViewState["DataSource"] != null ? (DataTable)ViewState["DataSource"] : null; } set { ViewState["DataSource"] = value; } } private int PageIndexs { get { object o = ViewState["PageIndexs"]; return o == null ? 0 : Convert.ToInt32(o); } set { ViewState["PageIndexs"] = value; } } private int SumPages { get { object o = ViewState["SumPages"]; return o == null ? 0 : Convert.ToInt32(o); } set { ViewState["SumPages"] = value; } } #endregion //这里面的委托方式我就用到了一个PagingClickHandler用于回调的
#region 委托 public delegate void PagingClickHandler(object sender, EventArgs e); public delegate void UpbtnClickHandler(object sender, EventArgs e); public delegate void NextBtnClickHandler(object sender, EventArgs e); public delegate void FristbtnClickHandler(object sender, EventArgs e); public delegate void LastBtnClickHandler(object sender, EventArgs e); #endregion #region 事件 //用于回调的到页面的分页事件
public event PagingClickHandler PagingClick; protected virtual void OnPagingClick(object sender, EventArgs e) { if (PagingClick != null) { PagingClick(sender, e); } } //分页的按钮事件
protected virtual void FristbtnClick(object sender, EventArgs e) { if (PagingClick != null) { PageIndexs = 1; this.OnPagingClick(GetPagedTable(DataSource, PageIndexs, PageSizes), e); } } protected virtual void LastBtnClick(object sender, EventArgs e) { if (PagingClick != null) { PageIndexs = SumPages; this.OnPagingClick(GetPagedTable(DataSource, PageIndexs, PageSizes), e); } } //public event UpbtnClickHandler UpbtnClick; protected virtual void OnUpbtnClick(object sender, EventArgs e) { if (PagingClick != null) { if (PageIndexs - 1 >= 1) { PageIndexs--; this.OnPagingClick(GetPagedTable(DataSource, PageIndexs, PageSizes), e); } } } //public event NextBtnClickHandler NextbtnClick; protected virtual void OnNextbtnClick(object sender, EventArgs e) { if (PagingClick != null) { if (PageIndexs + 1 <= SumPages) { PageIndexs++; this.OnPagingClick(GetPagedTable(DataSource, PageIndexs, PageSizes), e); } } } #endregion #region 分页函数 public DataTable GetPagedTable(DataTable dt, int PageIndex, int PageSize) { if (PageIndex == 0) { return dt; } DataTable newdt = dt.Copy(); newdt.Clear(); int rowbegin = (PageIndex - 1) * PageSize; int rowend = PageIndex * PageSize; if (rowbegin >= dt.Rows.Count) { return newdt; } if (rowend > dt.Rows.Count) { rowend = dt.Rows.Count; } for (int i = rowbegin; i <= rowend - 1; i++) { DataRow newdr = newdt.NewRow(); DataRow dr = dt.Rows[i]; foreach (DataColumn column in dt.Columns) { newdr[column.ColumnName] = dr[column.ColumnName]; } newdt.Rows.Add(newdr); } return newdt; } public int PageCount(int count, int pageye) { int page = 0; int sesepage = pageye; if (count % sesepage == 0) { page = count / sesepage; } else { page = (count / sesepage) + 1; } if (page == 0) { page += 1; } return page; } #endregion //初始化函数页面绑定数据源以后分页的结果集合在返回给页面
#region 初始化函数 public DataTable DataBind() { return ContrlInit(); } private DataTable ContrlInit() { this.PageIndexs = this.PageIndexs == 0 ? 1 : this.PageIndexs; this.SumPages = PageCount(this.DataSource.Rows.Count, PageSizes); //this.LblSumPages.Text = SumPages.ToString(); //this.LblPageIndexs.Text = PageIndexs.ToString(); return GetPagedTable(DataSource, PageIndexs, PageSizes); } //控件的呈现 4个按钮和1个文本 按钮回发的参数 0 ,1,-1,2
protected override void Render(HtmlTextWriter output) { base.Render(output); output.Write(" "); this.Fristbtn.ID = "OnUpbtn" + base.ID; this.Fristbtn.Text = "首页 "; Fristbtn.Attributes.Add(HtmlTextWriterAttribute.Href.ToString(), this.Page.ClientScript.GetPostBackClientHyperlink(this, "0")); this.Fristbtn.RenderControl(output); this.Upbtn.ID = "OnUpbtn" + base.ID; this.Upbtn.Text = "上一页 "; Upbtn.Attributes.Add(HtmlTextWriterAttribute.Href.ToString(), this.Page.ClientScript.GetPostBackClientHyperlink(this, "-1")); this.Upbtn.RenderControl(output); this.NextBtn.ID = "NextBtn" + base.ID; this.NextBtn.Text = "下一页 "; this.NextBtn.Attributes.Add(HtmlTextWriterAttribute.Href.ToString(), this.Page.ClientScript.GetPostBackClientHyperlink(this, "1")); this.NextBtn.RenderControl(output); this.LastBtn.ID = "OnUpbtn" + base.ID; this.LastBtn.Text = "尾页"; LastBtn.Attributes.Add(HtmlTextWriterAttribute.Href.ToString(), this.Page.ClientScript.GetPostBackClientHyperlink(this, "2")); this.LastBtn.RenderControl(output); this.LblPageInfo.ID = "LblPageIndexstxt" + base.ID; this.LblPageInfo.Text = "(第" + PageIndexs.ToString() + "页 共" + SumPages.ToString() + "页)"; this.LblPageInfo.RenderControl(output); //this.LblPageIndexs.ID = "LblPageIndexs" + base.ID; //this.LblPageIndexs.Text = PageIndexs.ToString(); //this.LblPageIndexs.RenderControl(output); //this.LblSumPagestxt.ID = "LblSumPagestxt" + base.ID; //this.LblSumPagestxt.Text = "总页数:"; //this.LblSumPagestxt.RenderControl(output); //this.LblSumPages.ID = "LblSumPages" + base.ID; //this.LblSumPages.Text = SumPages.ToString(); //this.LblSumPages.RenderControl(output); } #endregion //最主要的一个部分 来判断用户点击翻页时回发的是那个事件 我定义的按钮回发的参数 0 ,1,-1,2
public void RaisePostBackEvent(string eventArgument) { //string[] args = eventArgument.Split(Constant.ARGUMENT_SPLITTER); //if (args == null || args.Length < 1) // return; switch (eventArgument) { case "0": this.FristbtnClick(null, null); break; case "-1": this.OnUpbtnClick(null, null); break; case "1": this.OnNextbtnClick(null, null); break; case "2": this.LastBtnClick(null, null); break; default: this.OnUpbtnClick(null, null); break; } } } }
编译以后会在工具中看见这个控件 拖到页面上
页面
<asp:Repeater ID="Rpt" runat="server" > <HeaderTemplate> <ul> </HeaderTemplate> <ItemTemplate> <li> <strong><%# Eval("dtdate")%> 留言:</strong> <div class="cont"> <p class="txt"><%# Eval("sMessage")%></p> <div class="replay"> <span class="repTea"><%# Eval("adminName")%></span> 回复 <%# Eval("dtadmindate")%> <p><%# Eval("AdminMessage")%></p> </div> </div> </li> </ItemTemplate> <FooterTemplate> </ul> </FooterTemplate> </asp:Repeater>
<GS:DataPaging ID="DataPaging1" runat="server" PageSizes="3" onpagingclick="DataPaging1_PagingClick"> </GS:DataPaging>
设置好 每页记录数和分页之后的事件后台代码
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { LoadPage(); } }
private void LoadPage() { DataPaging1.DataSource = (new NoticeMessageLogic()).GetMessageInfos(StudentMessage.Text, dtStudentDate.Text, WebSession.AliasCode); Rpt.DataSource = DataPaging1.DataBind(); Rpt.DataBind(); } protected void DataPaging1_PagingClick(object sender, EventArgs e) { //LoadPage(); Rpt.DataSource = sender; Rpt.DataBind(); }
要源码的 我这里不知道怎么上传。
试试效果吧 ~~~兄弟也辛苦半天了,加我的吧 QQ群 205914059