DataTable分页控件设计(适用于Gridview和Repeater)

插播个广告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.WebControlIPostBackEventHandler     {      //定义翻页的按钮和相关标签
        #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("&nbsp;");             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(nullnull);                     break;                 case "-1":                     this.OnUpbtnClick(nullnull);                     break;                 case "1":                     this.OnNextbtnClick(nullnull);                     break;                 case "2":                     this.LastBtnClick(nullnull);                     break;                 default:                     this.OnUpbtnClick(nullnull);                     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> &nbsp;回复 <%# 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

posted @ 2012-11-02 09:43  zhaosazi77  阅读(300)  评论(0编辑  收藏  举报