模仿MS PetShop重写了Repeater控件,使其具有分页功能。
.cs
 using System;
using System;
 using System.Data;
using System.Data;
 using System.Collections;
using System.Collections;
 using System.Text.RegularExpressions;
using System.Text.RegularExpressions;
 using System.Web.UI.WebControls;
using System.Web.UI.WebControls;


 namespace Common.WebControls
namespace Common.WebControls
 {
{
 public class MyRepeater : Repeater
    public class MyRepeater : Repeater
 {
    {
 //常量
        //常量
 protected const string HTML1 = "<table cellpadding=0 cellspacing=0><tr><td align={0} class=pageHeader>";
        protected const string HTML1 = "<table cellpadding=0 cellspacing=0><tr><td align={0} class=pageHeader>";
 protected const string HTML2 = "</td></tr><tr class=gridNav><td>";
        protected const string HTML2 = "</td></tr><tr class=gridNav><td>";
 protected const string HTML3 = "</td></tr><tr><td align={0} class=pageFooter>";
        protected const string HTML3 = "</td></tr><tr><td align={0} class=pageFooter>";
 protected const string HTML4 = "</td></tr></table>";
        protected const string HTML4 = "</td></tr></table>";

 private const string LINK = "<a href=?{0}={1} class=pageLink>{2}</a>";
        private const string LINK = "<a href=?{0}={1} class=pageLink>{2}</a>";
 private const string LINK_NEXT = "<a href=?{0}={1} title='下{2}页' class=pageLink>{3}</a>";
        private const string LINK_NEXT = "<a href=?{0}={1} title='下{2}页' class=pageLink>{3}</a>";
 private const string LINK_PREV = "<a href=?{0}={1} title='上{2}页' class=pageLink>{3}</a>";
        private const string LINK_PREV = "<a href=?{0}={1} title='上{2}页' class=pageLink>{3}</a>";

 //私有变量
        //私有变量
 private string mstrEmptyText = "";//DataSource为空的时候显示的字
        private string mstrEmptyText = "";//DataSource为空的时候显示的字
 private string mstrPageKey = "Page";//在地址栏上显示的页码关键字,比如page=1
        private string mstrPageKey = "Page";//在地址栏上显示的页码关键字,比如page=1
 private string mstrPageIndexAlign = "right";//页码对齐方式
        private string mstrPageIndexAlign = "right";//页码对齐方式
 private string mstrPrevPageText = "<<";//上页文字
        private string mstrPrevPageText = "<<";//上页文字
 private string mstrNextPageText = ">>";//下页文字
        private string mstrNextPageText = ">>";//下页文字
 private PagerPosition pagePosition = PagerPosition.TopAndBottom;//页码位置,上、下、上下都有
        private PagerPosition pagePosition = PagerPosition.TopAndBottom;//页码位置,上、下、上下都有
 private PagerMode pageMode = PagerMode.NumericPages;//页导航元素模式
        private PagerMode pageMode = PagerMode.NumericPages;//页导航元素模式
 private int intPageIndexCount = 10;//显示的页码数
        private int intPageIndexCount = 10;//显示的页码数
 private int intPageSize = 10;//一页显示的记录数
        private int intPageSize = 10;//一页显示的记录数
 private int intCurrentPage = 1;//当前页
        private int intCurrentPage = 1;//当前页
 private IList dataSource;//数据源,必须可以转换为IList
        private IList dataSource;//数据源,必须可以转换为IList
 private bool blnRealSource = false;//数据源已分页
        private bool blnRealSource = false;//数据源已分页

 private int intItemCount;
        private int intItemCount;

 /// <summary>
        /// <summary>
 /// 数据源为空时显示的文本,默认为空
        /// 数据源为空时显示的文本,默认为空
 /// </summary>
        /// </summary>
 public string EmptyText
        public string EmptyText
 {
        {
 set { mstrEmptyText = value; }
            set { mstrEmptyText = value; }
 }
        }

 public bool RealSource
        public bool RealSource
 {
        {
 get { return blnRealSource; }
            get { return blnRealSource; }
 set { blnRealSource = value; }
            set { blnRealSource = value; }
 }
        }

 /// <summary>
        /// <summary>
 /// 获取或设置自定义地址栏上页码标志关键字,默认为Page。
        /// 获取或设置自定义地址栏上页码标志关键字,默认为Page。
 /// 如果页面有两个MyRepeater,必须定义两个不同的PageKey。
        /// 如果页面有两个MyRepeater,必须定义两个不同的PageKey。
 /// 否则不能正确定位第二个MyRepeater。
        /// 否则不能正确定位第二个MyRepeater。
 /// </summary>
        /// </summary>
 public string PageKey
        public string PageKey
 {
        {
 get { return mstrPageKey; }
            get { return mstrPageKey; }
 set { mstrPageKey = value; }
            set { mstrPageKey = value; }
 }
        }

 /// <summary>
        /// <summary>
 /// 获取或设置要在 MyRepeater 控件的单页上显示的项数。
        /// 获取或设置要在 MyRepeater 控件的单页上显示的项数。
 /// 默认为10项。
        /// 默认为10项。
 /// </summary>
        /// </summary>
 public int PageSize
        public int PageSize
 {
        {
 get { return intPageSize; }
            get { return intPageSize; }
 set { intPageSize = value; }
            set { intPageSize = value; }
 }
        }

 /// <summary>
        /// <summary>
 /// 获取或设置当前显示页的索引。默认为1。
        /// 获取或设置当前显示页的索引。默认为1。
 /// </summary>
        /// </summary>
 public int CurrentPageIndex
        public int CurrentPageIndex
 {
        {
 get { return intCurrentPage; }
            get { return intCurrentPage; }
 set {intCurrentPage = value; }
            set {intCurrentPage = value; }
 }
        }

 /// <summary>
        /// <summary>
 /// 获取或设置 MyRepeater 控件中页导航元素的位置。
        /// 获取或设置 MyRepeater 控件中页导航元素的位置。
 /// 默认为 TopAndBottom。
        /// 默认为 TopAndBottom。
 /// </summary>
        /// </summary>
 public PagerPosition PagePosition
        public PagerPosition PagePosition
 {
        {
 get { return pagePosition; }
            get { return pagePosition; }
 set { pagePosition = value; }
            set { pagePosition = value; }
 }
        }

 /// <summary>
        /// <summary>
 /// 获取或设置一个值,该值指定页导航元素是显示链接到下一页和前一页的按钮,还是显示直接与某一页链接的数值按钮。
        /// 获取或设置一个值,该值指定页导航元素是显示链接到下一页和前一页的按钮,还是显示直接与某一页链接的数值按钮。
 /// 默认为 NumericPages。
        /// 默认为 NumericPages。
 /// </summary>
        /// </summary>
 public PagerMode PageMode
        public PagerMode PageMode
 {
        {
 get { return pageMode; }
            get { return pageMode; }
 set { pageMode = value; }
            set { pageMode = value; }
 }
        }

 /// <summary>
        /// <summary>
 /// 获取 MyRepeater 控件中页导航元素的对齐方式。
        /// 获取 MyRepeater 控件中页导航元素的对齐方式。
 /// 默认为right。
        /// 默认为right。
 /// </summary>
        /// </summary>
 public HorizontalAlign PageAlign
        public HorizontalAlign PageAlign
 {
        {
 set { mstrPageIndexAlign = value.ToString(); }
            set { mstrPageIndexAlign = value.ToString(); }
 }
        }

 /// <summary>
        /// <summary>
 /// 获取或设置为前一页按钮显示的文本。
        /// 获取或设置为前一页按钮显示的文本。
 /// </summary>
        /// </summary>
 public string PrevPageText
        public string PrevPageText
 {
        {
 get { return mstrPrevPageText; }
            get { return mstrPrevPageText; }
 set { mstrPrevPageText = value; }
            set { mstrPrevPageText = value; }
 }
        }

 /// <summary>
        /// <summary>
 /// 获取或设置为下一页按钮显示的文本。
        /// 获取或设置为下一页按钮显示的文本。
 /// </summary>
        /// </summary>
 public string NextPageText
        public string NextPageText
 {
        {
 get { return mstrNextPageText; }
            get { return mstrNextPageText; }
 set { mstrNextPageText = value; }
            set { mstrNextPageText = value; }
 }
        }

 /// <summary>
        /// <summary>
 /// 获取显示 MyRepeater 控件中各项所需的总页数。
        /// 获取显示 MyRepeater 控件中各项所需的总页数。
 /// </summary>
        /// </summary>
 public int PageCount
        public int PageCount
 {
        {
 get { return (intItemCount - 1) / intPageSize + 1; }
            get { return (intItemCount - 1) / intPageSize + 1; }
 }
        }

 /// <summary>
        /// <summary>
 /// 设置 MyRepeater 控件中页导航元素显示的页码数。
        /// 设置 MyRepeater 控件中页导航元素显示的页码数。
 /// 默认为10。
        /// 默认为10。
 /// </summary>
        /// </summary>
 public int PageIndexCount
        public int PageIndexCount
 {
        {
 set { intPageIndexCount = value; }
            set { intPageIndexCount = value; }
 }
        }

 /// <summary>
        /// <summary>
 /// 设置 MyRepeater 控件的数据源。
        /// 设置 MyRepeater 控件的数据源。
 /// 可以接受 DataSet、DataTable和所以实现了IList借口的数据源。
        /// 可以接受 DataSet、DataTable和所以实现了IList借口的数据源。
 /// </summary>
        /// </summary>
 public override object DataSource
        public override object DataSource
 {
        {
 set
            set
 {
            {
 try
                try
 {
                {
 if(value == null)
                    if(value == null)
 {
                    {
 dataSource = null;
                        dataSource = null;
 intItemCount = 0;
                        intItemCount = 0;
 }
                    }
 else if(value.GetType() == typeof(DataTable))//数据源是DataTable,转化为IList
                    else if(value.GetType() == typeof(DataTable))//数据源是DataTable,转化为IList
 {
                    {
 dataSource = (IList)(new DataView((DataTable)value));
                        dataSource = (IList)(new DataView((DataTable)value));
 intItemCount = dataSource.Count;
                        intItemCount = dataSource.Count;
 }
                    }
 else if(value.GetType() == typeof(DataSet))//数据源是DataSet,转化为IList
                    else if(value.GetType() == typeof(DataSet))//数据源是DataSet,转化为IList
 {
                    {
 dataSource = (IList)(new DataView(((DataSet)value).Tables[0]));
                        dataSource = (IList)(new DataView(((DataSet)value).Tables[0]));
 intItemCount = dataSource.Count;
                        intItemCount = dataSource.Count;
 }
                    }
 else
                    else
 {
                    {
 dataSource = (IList)value;
                        dataSource = (IList)value;
 intItemCount = dataSource.Count;
                        intItemCount = dataSource.Count;
 }
                    }
 }
                }
 catch
                catch
 {
                {
 dataSource = null;
                    dataSource = null;
 intItemCount =0;
                    intItemCount =0;
 }
                }
 }
            }
 }
        }

 protected override void OnLoad(EventArgs e)
        protected override void OnLoad(EventArgs e)
 {
        {
 if(Visible)
            if(Visible) 
 {
            {
 string page = Context.Request[mstrPageKey];//取得页码
                string page = Context.Request[mstrPageKey];//取得页码
 int index = (page != null) ? int.Parse(page) : 1;
                int index = (page != null) ? int.Parse(page) : 1;
 index = index <= 0 ? 1 : index;
                index = index <= 0 ? 1 : index;
 SetPage(index);
                SetPage(index);
 }
            }
 }
        }

 public void SetPage(int index)
        public void SetPage(int index) 
 {
        {
 OnPageIndexChanged(new DataGridPageChangedEventArgs(null, index));
            OnPageIndexChanged(new DataGridPageChangedEventArgs(null, index));
 }
        }


 protected override void Render(System.Web.UI.HtmlTextWriter writer)
        protected override void Render(System.Web.UI.HtmlTextWriter writer)
 {
        {
 if(intItemCount == 0)//数据源为空
            if(intItemCount == 0)//数据源为空
 {
            {
 writer.Write(mstrEmptyText);
                writer.Write(mstrEmptyText);
 return;
                return;
 }
            }

 writer.Write(HTML1, mstrPageIndexAlign);
            writer.Write(HTML1, mstrPageIndexAlign);
 if(pagePosition != PagerPosition.Bottom)//页导航元素的位置为Top或者TopAndBottom
            if(pagePosition != PagerPosition.Bottom)//页导航元素的位置为Top或者TopAndBottom
 {
            {
 WritePages(writer);
                WritePages(writer);
 }
            }
 writer.Write(HTML2);
            writer.Write(HTML2);
 base.Render(writer);
            base.Render(writer);
 writer.Write(HTML3, mstrPageIndexAlign);
            writer.Write(HTML3, mstrPageIndexAlign);
 if(pagePosition != PagerPosition.Top)//页导航元素的位置为Bottom或者TopAndBottom
            if(pagePosition != PagerPosition.Top)//页导航元素的位置为Bottom或者TopAndBottom
 {
            {
 WritePages(writer);
                WritePages(writer);
 }
            }
 writer.Write(HTML4);
            writer.Write(HTML4);
 }
        }

 protected override void OnDataBinding(EventArgs e)
        protected override void OnDataBinding(EventArgs e)
 {
        {
 if(blnRealSource)//数据源已分页
            if(blnRealSource)//数据源已分页
 {
            {
 base.DataSource = dataSource;
                base.DataSource = dataSource;
 }
            }
 else//数据源未分页
            else//数据源未分页
 {
            {
 int start = (intCurrentPage - 1) * intPageSize;
                int start = (intCurrentPage - 1) * intPageSize;
 int size = Math.Min(intPageSize, intItemCount - start);
                int size = Math.Min(intPageSize, intItemCount - start);

 IList list = new ArrayList();
                IList list = new ArrayList();

 for(int i = 0; i < size; i++)
                for(int i = 0; i < size; i++)
 {
                {
 list.Add(dataSource[start + i]);
                    list.Add(dataSource[start + i]);
 }
                }
 base.DataSource = list;
                base.DataSource = list;
 }
            }
 base.OnDataBinding (e);
            base.OnDataBinding (e);
 }
        }

 public event DataGridPageChangedEventHandler PageIndexChanged;
        public event DataGridPageChangedEventHandler PageIndexChanged;

 virtual protected void OnPageIndexChanged(DataGridPageChangedEventArgs e)
        virtual protected void OnPageIndexChanged(DataGridPageChangedEventArgs e) 
 {
        {
 if (PageIndexChanged != null)
            if (PageIndexChanged != null)
 {
            {
 PageIndexChanged(this, e);
                PageIndexChanged(this, e);
 }
            }
 }
        }

 /// <summary>
        /// <summary>
 /// 写页导航元素。
        /// 写页导航元素。
 /// </summary>
        /// </summary>
 /// <param name="writer">System.Web.UI.HtmlTextWriter</param>
        /// <param name="writer">System.Web.UI.HtmlTextWriter</param>
 virtual protected void WritePages(System.Web.UI.HtmlTextWriter writer)
        virtual protected void WritePages(System.Web.UI.HtmlTextWriter writer)
 {
        {
 
            
 if(pageMode == PagerMode.NextPrev)//页导航元素为上下页
            if(pageMode == PagerMode.NextPrev)//页导航元素为上下页
 {
            {
 intPageIndexCount = 1;
                intPageIndexCount = 1;
 }
            }

 intPageIndexCount = intPageIndexCount <= 0 ? 1 : intPageIndexCount;
            intPageIndexCount = intPageIndexCount <= 0 ? 1 : intPageIndexCount;
 //开始的页码
            //开始的页码
 int start = (intCurrentPage - 1) / intPageIndexCount;
            int start = (intCurrentPage - 1) / intPageIndexCount;
 start = start * intPageIndexCount + 1;
            start = start * intPageIndexCount + 1;
 //结束的页码
            //结束的页码
 int end = start + intPageIndexCount - 1;
            int end = start + intPageIndexCount - 1;
 end = end > PageCount ? PageCount : end;
            end = end > PageCount ? PageCount : end;

 //保留PageKey以外的QueryString
            //保留PageKey以外的QueryString
 string query = Context.Request.Url.Query.Replace("?","&");
            string query = Context.Request.Url.Query.Replace("?","&");
 Regex rx = new Regex("&" + mstrPageKey + "=\d+", RegexOptions.None);
            Regex rx = new Regex("&" + mstrPageKey + "=\d+", RegexOptions.None);
 query = rx.Replace(query, string.Empty);
            query = rx.Replace(query, string.Empty);

 //写向前的导航元素
            //写向前的导航元素
 if(start > 1)
            if(start > 1)
 {
            {
 writer.Write(LINK_PREV, mstrPageKey, (start - 1) + query, intPageIndexCount, mstrPrevPageText);
                writer.Write(LINK_PREV, mstrPageKey, (start - 1) + query, intPageIndexCount, mstrPrevPageText);
 }
            }

 if(pageMode != PagerMode.NextPrev)//页导航元素为上下页
            if(pageMode != PagerMode.NextPrev)//页导航元素为上下页
 {
            {
 //写从start到end的页码
                //写从start到end的页码
 for(int i = start; i <= end; i++)
                for(int i = start; i <= end; i++)
 {
                {
 writer.Write("  ");
                    writer.Write("  ");
 if(i == intCurrentPage)//当前页没有联接
                    if(i == intCurrentPage)//当前页没有联接
 {
                    {
 writer.Write(i);
                        writer.Write(i);
 }
                    }
 else//不是当前页有链接
                    else//不是当前页有链接
 {
                    {    
 writer.Write(LINK, mstrPageKey, i + query, i);
                        writer.Write(LINK, mstrPageKey, i + query, i);
 }
                    }
 }
                }
 }
            }

 //写向后的导航元素
            //写向后的导航元素
 if(end < PageCount)
            if(end < PageCount)
 {
            {
 writer.Write("  ");
                writer.Write("  ");
 writer.Write(LINK_NEXT, mstrPageKey, (end + 1) + query, intPageIndexCount, mstrNextPageText);
                writer.Write(LINK_NEXT, mstrPageKey, (end + 1) + query, intPageIndexCount, mstrNextPageText);
 }
            }
 }
        }
 }
    }
 }
}

.aspx
 <MYCONTROL:MYREPEATER id="repeater" runat="server" PageKey="Pages" OnPageIndexChanged="PageChanged" EmptyText="nothing">
<MYCONTROL:MYREPEATER id="repeater" runat="server" PageKey="Pages" OnPageIndexChanged="PageChanged" EmptyText="nothing">
 <headertemplate>
    <headertemplate>
 <table cellpadding="0" cellspacing="0">
        <table cellpadding="0" cellspacing="0">
 <tr class="gridHead">
            <tr class="gridHead">
 <td>Product</td>
                <td>Product</td>
 <td>Name</td>
                <td>Name</td>
 <td>Description</td>
                <td>Description</td>
 </tr>
            </tr>
 </headertemplate>
    </headertemplate>
 <itemtemplate>
    <itemtemplate>
 <tr class="gridItem">
        <tr class="gridItem">
 <td><%# DataBinder.Eval(Container.DataItem, "Id") %></td>
            <td><%# DataBinder.Eval(Container.DataItem, "Id") %></td>
 <td><a href='Items.aspx?productId=<%# DataBinder.Eval(Container.DataItem, "Id") %>'><%# DataBinder.Eval(Container.DataItem, "Name") %></a></td>
            <td><a href='Items.aspx?productId=<%# DataBinder.Eval(Container.DataItem, "Id") %>'><%# DataBinder.Eval(Container.DataItem, "Name") %></a></td>
 <td><%# DataBinder.Eval(Container.DataItem, "Description") %></td>
            <td><%# DataBinder.Eval(Container.DataItem, "Description") %></td>
 </tr>
        </tr>
 </itemtemplate>
    </itemtemplate>
 <footertemplate>
    <footertemplate>
 </table>
                    </table>
 </footertemplate>
                </footertemplate>
 </MYCONTROL:MYREPEATER>
</MYCONTROL:MYREPEATER>
.aspx.cs
 protected void PageChanged(object sender, DataGridPageChangedEventArgs e)
protected void PageChanged(object sender, DataGridPageChangedEventArgs e)
 {
        {
 Common.WebControls.MyRepeater re = sender as Common.WebControls.MyRepeater;
            Common.WebControls.MyRepeater re = sender as Common.WebControls.MyRepeater;
 re.CurrentPageIndex = e.NewPageIndex;
            re.CurrentPageIndex = e.NewPageIndex;
 DataTable dt = new DataTable();
            DataTable dt = new DataTable();
 dt.Columns.Add("Id");
            dt.Columns.Add("Id");
 dt.Columns.Add("Name");
            dt.Columns.Add("Name");
 dt.Columns.Add("Description");
            dt.Columns.Add("Description");

 for(int i = 0; i < 350; i++)
            for(int i = 0; i < 350; i++)
 {
            {
 DataRow dr = dt.NewRow();
                DataRow dr = dt.NewRow();
 dr[0] = i.ToString();
                dr[0] = i.ToString();
 dr[1] = "testName";
                dr[1] = "testName";
 dr[2] = "testDescription";
                dr[2] = "testDescription";
 dt.Rows.Add(dr);
                dt.Rows.Add(dr);
 }
            }

 re.PrevPageText = "上 页";
            re.PrevPageText = "上 页";
 re.NextPageText = "下 页";
            re.NextPageText = "下 页";
 re.PageMode = PagerMode.NextPrev;
            re.PageMode = PagerMode.NextPrev;
 re.PageAlign = HorizontalAlign.Right;
            re.PageAlign = HorizontalAlign.Right;
 re.PagePosition = PagerPosition.Bottom;
            re.PagePosition = PagerPosition.Bottom;
 re.PageSize = 20;
            re.PageSize = 20;
 re.DataSource = dt;
            re.DataSource = dt;
 re.DataBind();
            re.DataBind();
 }
        }
其实和PetShop里的差不多,就加强了一点分页功能。
.cs
 using System;
using System; using System.Data;
using System.Data; using System.Collections;
using System.Collections; using System.Text.RegularExpressions;
using System.Text.RegularExpressions; using System.Web.UI.WebControls;
using System.Web.UI.WebControls;

 namespace Common.WebControls
namespace Common.WebControls {
{ public class MyRepeater : Repeater
    public class MyRepeater : Repeater {
    { //常量
        //常量 protected const string HTML1 = "<table cellpadding=0 cellspacing=0><tr><td align={0} class=pageHeader>";
        protected const string HTML1 = "<table cellpadding=0 cellspacing=0><tr><td align={0} class=pageHeader>"; protected const string HTML2 = "</td></tr><tr class=gridNav><td>";
        protected const string HTML2 = "</td></tr><tr class=gridNav><td>"; protected const string HTML3 = "</td></tr><tr><td align={0} class=pageFooter>";
        protected const string HTML3 = "</td></tr><tr><td align={0} class=pageFooter>"; protected const string HTML4 = "</td></tr></table>";
        protected const string HTML4 = "</td></tr></table>";
 private const string LINK = "<a href=?{0}={1} class=pageLink>{2}</a>";
        private const string LINK = "<a href=?{0}={1} class=pageLink>{2}</a>"; private const string LINK_NEXT = "<a href=?{0}={1} title='下{2}页' class=pageLink>{3}</a>";
        private const string LINK_NEXT = "<a href=?{0}={1} title='下{2}页' class=pageLink>{3}</a>"; private const string LINK_PREV = "<a href=?{0}={1} title='上{2}页' class=pageLink>{3}</a>";
        private const string LINK_PREV = "<a href=?{0}={1} title='上{2}页' class=pageLink>{3}</a>";
 //私有变量
        //私有变量 private string mstrEmptyText = "";//DataSource为空的时候显示的字
        private string mstrEmptyText = "";//DataSource为空的时候显示的字 private string mstrPageKey = "Page";//在地址栏上显示的页码关键字,比如page=1
        private string mstrPageKey = "Page";//在地址栏上显示的页码关键字,比如page=1 private string mstrPageIndexAlign = "right";//页码对齐方式
        private string mstrPageIndexAlign = "right";//页码对齐方式 private string mstrPrevPageText = "<<";//上页文字
        private string mstrPrevPageText = "<<";//上页文字 private string mstrNextPageText = ">>";//下页文字
        private string mstrNextPageText = ">>";//下页文字 private PagerPosition pagePosition = PagerPosition.TopAndBottom;//页码位置,上、下、上下都有
        private PagerPosition pagePosition = PagerPosition.TopAndBottom;//页码位置,上、下、上下都有 private PagerMode pageMode = PagerMode.NumericPages;//页导航元素模式
        private PagerMode pageMode = PagerMode.NumericPages;//页导航元素模式 private int intPageIndexCount = 10;//显示的页码数
        private int intPageIndexCount = 10;//显示的页码数 private int intPageSize = 10;//一页显示的记录数
        private int intPageSize = 10;//一页显示的记录数 private int intCurrentPage = 1;//当前页
        private int intCurrentPage = 1;//当前页 private IList dataSource;//数据源,必须可以转换为IList
        private IList dataSource;//数据源,必须可以转换为IList private bool blnRealSource = false;//数据源已分页
        private bool blnRealSource = false;//数据源已分页
 private int intItemCount;
        private int intItemCount;
 /// <summary>
        /// <summary> /// 数据源为空时显示的文本,默认为空
        /// 数据源为空时显示的文本,默认为空 /// </summary>
        /// </summary> public string EmptyText
        public string EmptyText {
        { set { mstrEmptyText = value; }
            set { mstrEmptyText = value; } }
        }
 public bool RealSource
        public bool RealSource {
        { get { return blnRealSource; }
            get { return blnRealSource; } set { blnRealSource = value; }
            set { blnRealSource = value; } }
        }
 /// <summary>
        /// <summary> /// 获取或设置自定义地址栏上页码标志关键字,默认为Page。
        /// 获取或设置自定义地址栏上页码标志关键字,默认为Page。 /// 如果页面有两个MyRepeater,必须定义两个不同的PageKey。
        /// 如果页面有两个MyRepeater,必须定义两个不同的PageKey。 /// 否则不能正确定位第二个MyRepeater。
        /// 否则不能正确定位第二个MyRepeater。 /// </summary>
        /// </summary> public string PageKey
        public string PageKey {
        { get { return mstrPageKey; }
            get { return mstrPageKey; } set { mstrPageKey = value; }
            set { mstrPageKey = value; } }
        }
 /// <summary>
        /// <summary> /// 获取或设置要在 MyRepeater 控件的单页上显示的项数。
        /// 获取或设置要在 MyRepeater 控件的单页上显示的项数。 /// 默认为10项。
        /// 默认为10项。 /// </summary>
        /// </summary> public int PageSize
        public int PageSize {
        { get { return intPageSize; }
            get { return intPageSize; } set { intPageSize = value; }
            set { intPageSize = value; } }
        }
 /// <summary>
        /// <summary> /// 获取或设置当前显示页的索引。默认为1。
        /// 获取或设置当前显示页的索引。默认为1。 /// </summary>
        /// </summary> public int CurrentPageIndex
        public int CurrentPageIndex {
        { get { return intCurrentPage; }
            get { return intCurrentPage; } set {intCurrentPage = value; }
            set {intCurrentPage = value; } }
        }
 /// <summary>
        /// <summary> /// 获取或设置 MyRepeater 控件中页导航元素的位置。
        /// 获取或设置 MyRepeater 控件中页导航元素的位置。 /// 默认为 TopAndBottom。
        /// 默认为 TopAndBottom。 /// </summary>
        /// </summary> public PagerPosition PagePosition
        public PagerPosition PagePosition {
        { get { return pagePosition; }
            get { return pagePosition; } set { pagePosition = value; }
            set { pagePosition = value; } }
        }
 /// <summary>
        /// <summary> /// 获取或设置一个值,该值指定页导航元素是显示链接到下一页和前一页的按钮,还是显示直接与某一页链接的数值按钮。
        /// 获取或设置一个值,该值指定页导航元素是显示链接到下一页和前一页的按钮,还是显示直接与某一页链接的数值按钮。 /// 默认为 NumericPages。
        /// 默认为 NumericPages。 /// </summary>
        /// </summary> public PagerMode PageMode
        public PagerMode PageMode {
        { get { return pageMode; }
            get { return pageMode; } set { pageMode = value; }
            set { pageMode = value; } }
        }
 /// <summary>
        /// <summary> /// 获取 MyRepeater 控件中页导航元素的对齐方式。
        /// 获取 MyRepeater 控件中页导航元素的对齐方式。 /// 默认为right。
        /// 默认为right。 /// </summary>
        /// </summary> public HorizontalAlign PageAlign
        public HorizontalAlign PageAlign {
        { set { mstrPageIndexAlign = value.ToString(); }
            set { mstrPageIndexAlign = value.ToString(); } }
        }
 /// <summary>
        /// <summary> /// 获取或设置为前一页按钮显示的文本。
        /// 获取或设置为前一页按钮显示的文本。 /// </summary>
        /// </summary> public string PrevPageText
        public string PrevPageText {
        { get { return mstrPrevPageText; }
            get { return mstrPrevPageText; } set { mstrPrevPageText = value; }
            set { mstrPrevPageText = value; } }
        }
 /// <summary>
        /// <summary> /// 获取或设置为下一页按钮显示的文本。
        /// 获取或设置为下一页按钮显示的文本。 /// </summary>
        /// </summary> public string NextPageText
        public string NextPageText {
        { get { return mstrNextPageText; }
            get { return mstrNextPageText; } set { mstrNextPageText = value; }
            set { mstrNextPageText = value; } }
        }
 /// <summary>
        /// <summary> /// 获取显示 MyRepeater 控件中各项所需的总页数。
        /// 获取显示 MyRepeater 控件中各项所需的总页数。 /// </summary>
        /// </summary> public int PageCount
        public int PageCount {
        { get { return (intItemCount - 1) / intPageSize + 1; }
            get { return (intItemCount - 1) / intPageSize + 1; } }
        }
 /// <summary>
        /// <summary> /// 设置 MyRepeater 控件中页导航元素显示的页码数。
        /// 设置 MyRepeater 控件中页导航元素显示的页码数。 /// 默认为10。
        /// 默认为10。 /// </summary>
        /// </summary> public int PageIndexCount
        public int PageIndexCount {
        { set { intPageIndexCount = value; }
            set { intPageIndexCount = value; } }
        }
 /// <summary>
        /// <summary> /// 设置 MyRepeater 控件的数据源。
        /// 设置 MyRepeater 控件的数据源。 /// 可以接受 DataSet、DataTable和所以实现了IList借口的数据源。
        /// 可以接受 DataSet、DataTable和所以实现了IList借口的数据源。 /// </summary>
        /// </summary> public override object DataSource
        public override object DataSource {
        { set
            set {
            { try
                try {
                { if(value == null)
                    if(value == null) {
                    { dataSource = null;
                        dataSource = null; intItemCount = 0;
                        intItemCount = 0; }
                    } else if(value.GetType() == typeof(DataTable))//数据源是DataTable,转化为IList
                    else if(value.GetType() == typeof(DataTable))//数据源是DataTable,转化为IList {
                    { dataSource = (IList)(new DataView((DataTable)value));
                        dataSource = (IList)(new DataView((DataTable)value)); intItemCount = dataSource.Count;
                        intItemCount = dataSource.Count; }
                    } else if(value.GetType() == typeof(DataSet))//数据源是DataSet,转化为IList
                    else if(value.GetType() == typeof(DataSet))//数据源是DataSet,转化为IList {
                    { dataSource = (IList)(new DataView(((DataSet)value).Tables[0]));
                        dataSource = (IList)(new DataView(((DataSet)value).Tables[0])); intItemCount = dataSource.Count;
                        intItemCount = dataSource.Count; }
                    } else
                    else {
                    { dataSource = (IList)value;
                        dataSource = (IList)value; intItemCount = dataSource.Count;
                        intItemCount = dataSource.Count; }
                    } }
                } catch
                catch {
                { dataSource = null;
                    dataSource = null; intItemCount =0;
                    intItemCount =0; }
                } }
            } }
        }
 protected override void OnLoad(EventArgs e)
        protected override void OnLoad(EventArgs e) {
        { if(Visible)
            if(Visible)  {
            { string page = Context.Request[mstrPageKey];//取得页码
                string page = Context.Request[mstrPageKey];//取得页码 int index = (page != null) ? int.Parse(page) : 1;
                int index = (page != null) ? int.Parse(page) : 1; index = index <= 0 ? 1 : index;
                index = index <= 0 ? 1 : index; SetPage(index);
                SetPage(index); }
            } }
        }
 public void SetPage(int index)
        public void SetPage(int index)  {
        { OnPageIndexChanged(new DataGridPageChangedEventArgs(null, index));
            OnPageIndexChanged(new DataGridPageChangedEventArgs(null, index)); }
        }

 protected override void Render(System.Web.UI.HtmlTextWriter writer)
        protected override void Render(System.Web.UI.HtmlTextWriter writer) {
        { if(intItemCount == 0)//数据源为空
            if(intItemCount == 0)//数据源为空 {
            { writer.Write(mstrEmptyText);
                writer.Write(mstrEmptyText); return;
                return; }
            }
 writer.Write(HTML1, mstrPageIndexAlign);
            writer.Write(HTML1, mstrPageIndexAlign); if(pagePosition != PagerPosition.Bottom)//页导航元素的位置为Top或者TopAndBottom
            if(pagePosition != PagerPosition.Bottom)//页导航元素的位置为Top或者TopAndBottom {
            { WritePages(writer);
                WritePages(writer); }
            } writer.Write(HTML2);
            writer.Write(HTML2); base.Render(writer);
            base.Render(writer); writer.Write(HTML3, mstrPageIndexAlign);
            writer.Write(HTML3, mstrPageIndexAlign); if(pagePosition != PagerPosition.Top)//页导航元素的位置为Bottom或者TopAndBottom
            if(pagePosition != PagerPosition.Top)//页导航元素的位置为Bottom或者TopAndBottom {
            { WritePages(writer);
                WritePages(writer); }
            } writer.Write(HTML4);
            writer.Write(HTML4); }
        }
 protected override void OnDataBinding(EventArgs e)
        protected override void OnDataBinding(EventArgs e) {
        { if(blnRealSource)//数据源已分页
            if(blnRealSource)//数据源已分页 {
            { base.DataSource = dataSource;
                base.DataSource = dataSource; }
            } else//数据源未分页
            else//数据源未分页 {
            { int start = (intCurrentPage - 1) * intPageSize;
                int start = (intCurrentPage - 1) * intPageSize; int size = Math.Min(intPageSize, intItemCount - start);
                int size = Math.Min(intPageSize, intItemCount - start);
 IList list = new ArrayList();
                IList list = new ArrayList();
 for(int i = 0; i < size; i++)
                for(int i = 0; i < size; i++) {
                { list.Add(dataSource[start + i]);
                    list.Add(dataSource[start + i]); }
                } base.DataSource = list;
                base.DataSource = list; }
            } base.OnDataBinding (e);
            base.OnDataBinding (e); }
        }
 public event DataGridPageChangedEventHandler PageIndexChanged;
        public event DataGridPageChangedEventHandler PageIndexChanged;
 virtual protected void OnPageIndexChanged(DataGridPageChangedEventArgs e)
        virtual protected void OnPageIndexChanged(DataGridPageChangedEventArgs e)  {
        { if (PageIndexChanged != null)
            if (PageIndexChanged != null) {
            { PageIndexChanged(this, e);
                PageIndexChanged(this, e); }
            } }
        }
 /// <summary>
        /// <summary> /// 写页导航元素。
        /// 写页导航元素。 /// </summary>
        /// </summary> /// <param name="writer">System.Web.UI.HtmlTextWriter</param>
        /// <param name="writer">System.Web.UI.HtmlTextWriter</param> virtual protected void WritePages(System.Web.UI.HtmlTextWriter writer)
        virtual protected void WritePages(System.Web.UI.HtmlTextWriter writer) {
        { 
             if(pageMode == PagerMode.NextPrev)//页导航元素为上下页
            if(pageMode == PagerMode.NextPrev)//页导航元素为上下页 {
            { intPageIndexCount = 1;
                intPageIndexCount = 1; }
            }
 intPageIndexCount = intPageIndexCount <= 0 ? 1 : intPageIndexCount;
            intPageIndexCount = intPageIndexCount <= 0 ? 1 : intPageIndexCount; //开始的页码
            //开始的页码 int start = (intCurrentPage - 1) / intPageIndexCount;
            int start = (intCurrentPage - 1) / intPageIndexCount; start = start * intPageIndexCount + 1;
            start = start * intPageIndexCount + 1; //结束的页码
            //结束的页码 int end = start + intPageIndexCount - 1;
            int end = start + intPageIndexCount - 1; end = end > PageCount ? PageCount : end;
            end = end > PageCount ? PageCount : end;
 //保留PageKey以外的QueryString
            //保留PageKey以外的QueryString string query = Context.Request.Url.Query.Replace("?","&");
            string query = Context.Request.Url.Query.Replace("?","&"); Regex rx = new Regex("&" + mstrPageKey + "=\d+", RegexOptions.None);
            Regex rx = new Regex("&" + mstrPageKey + "=\d+", RegexOptions.None); query = rx.Replace(query, string.Empty);
            query = rx.Replace(query, string.Empty);
 //写向前的导航元素
            //写向前的导航元素 if(start > 1)
            if(start > 1) {
            { writer.Write(LINK_PREV, mstrPageKey, (start - 1) + query, intPageIndexCount, mstrPrevPageText);
                writer.Write(LINK_PREV, mstrPageKey, (start - 1) + query, intPageIndexCount, mstrPrevPageText); }
            }
 if(pageMode != PagerMode.NextPrev)//页导航元素为上下页
            if(pageMode != PagerMode.NextPrev)//页导航元素为上下页 {
            { //写从start到end的页码
                //写从start到end的页码 for(int i = start; i <= end; i++)
                for(int i = start; i <= end; i++) {
                { writer.Write("  ");
                    writer.Write("  "); if(i == intCurrentPage)//当前页没有联接
                    if(i == intCurrentPage)//当前页没有联接 {
                    { writer.Write(i);
                        writer.Write(i); }
                    } else//不是当前页有链接
                    else//不是当前页有链接 {
                    {     writer.Write(LINK, mstrPageKey, i + query, i);
                        writer.Write(LINK, mstrPageKey, i + query, i); }
                    } }
                } }
            }
 //写向后的导航元素
            //写向后的导航元素 if(end < PageCount)
            if(end < PageCount) {
            { writer.Write("  ");
                writer.Write("  "); writer.Write(LINK_NEXT, mstrPageKey, (end + 1) + query, intPageIndexCount, mstrNextPageText);
                writer.Write(LINK_NEXT, mstrPageKey, (end + 1) + query, intPageIndexCount, mstrNextPageText); }
            } }
        } }
    } }
}
.aspx
 <MYCONTROL:MYREPEATER id="repeater" runat="server" PageKey="Pages" OnPageIndexChanged="PageChanged" EmptyText="nothing">
<MYCONTROL:MYREPEATER id="repeater" runat="server" PageKey="Pages" OnPageIndexChanged="PageChanged" EmptyText="nothing"> <headertemplate>
    <headertemplate> <table cellpadding="0" cellspacing="0">
        <table cellpadding="0" cellspacing="0"> <tr class="gridHead">
            <tr class="gridHead"> <td>Product</td>
                <td>Product</td> <td>Name</td>
                <td>Name</td> <td>Description</td>
                <td>Description</td> </tr>
            </tr> </headertemplate>
    </headertemplate> <itemtemplate>
    <itemtemplate> <tr class="gridItem">
        <tr class="gridItem"> <td><%# DataBinder.Eval(Container.DataItem, "Id") %></td>
            <td><%# DataBinder.Eval(Container.DataItem, "Id") %></td> <td><a href='Items.aspx?productId=<%# DataBinder.Eval(Container.DataItem, "Id") %>'><%# DataBinder.Eval(Container.DataItem, "Name") %></a></td>
            <td><a href='Items.aspx?productId=<%# DataBinder.Eval(Container.DataItem, "Id") %>'><%# DataBinder.Eval(Container.DataItem, "Name") %></a></td> <td><%# DataBinder.Eval(Container.DataItem, "Description") %></td>
            <td><%# DataBinder.Eval(Container.DataItem, "Description") %></td> </tr>
        </tr> </itemtemplate>
    </itemtemplate> <footertemplate>
    <footertemplate> </table>
                    </table> </footertemplate>
                </footertemplate> </MYCONTROL:MYREPEATER>
</MYCONTROL:MYREPEATER>.aspx.cs
 protected void PageChanged(object sender, DataGridPageChangedEventArgs e)
protected void PageChanged(object sender, DataGridPageChangedEventArgs e) {
        { Common.WebControls.MyRepeater re = sender as Common.WebControls.MyRepeater;
            Common.WebControls.MyRepeater re = sender as Common.WebControls.MyRepeater; re.CurrentPageIndex = e.NewPageIndex;
            re.CurrentPageIndex = e.NewPageIndex; DataTable dt = new DataTable();
            DataTable dt = new DataTable(); dt.Columns.Add("Id");
            dt.Columns.Add("Id"); dt.Columns.Add("Name");
            dt.Columns.Add("Name"); dt.Columns.Add("Description");
            dt.Columns.Add("Description");
 for(int i = 0; i < 350; i++)
            for(int i = 0; i < 350; i++) {
            { DataRow dr = dt.NewRow();
                DataRow dr = dt.NewRow(); dr[0] = i.ToString();
                dr[0] = i.ToString(); dr[1] = "testName";
                dr[1] = "testName"; dr[2] = "testDescription";
                dr[2] = "testDescription"; dt.Rows.Add(dr);
                dt.Rows.Add(dr); }
            }
 re.PrevPageText = "上 页";
            re.PrevPageText = "上 页"; re.NextPageText = "下 页";
            re.NextPageText = "下 页"; re.PageMode = PagerMode.NextPrev;
            re.PageMode = PagerMode.NextPrev; re.PageAlign = HorizontalAlign.Right;
            re.PageAlign = HorizontalAlign.Right; re.PagePosition = PagerPosition.Bottom;
            re.PagePosition = PagerPosition.Bottom; re.PageSize = 20;
            re.PageSize = 20; re.DataSource = dt;
            re.DataSource = dt; re.DataBind();
            re.DataBind(); }
        }其实和PetShop里的差不多,就加强了一点分页功能。
 
                    
                     
                    
                 
                    
                 
        

 
     
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号