Click here to Skip to main content
15,880,608 members
Articles / Web Development / ASP.NET

Extend Repeater to support DataPager

Rate me:
Please Sign up or sign in to vote.
4.56/5 (16 votes)
21 Oct 2011CPOL 122.6K   2.7K   20   45
How to extend Repeater to support DataPager.

Introduction

I have seen some examples of making a Repeater to work with a DataPager like it does with the ListView control. But all examples failed when I tried them, and I spent some time to get this to work. Here is my solution.

Using the code

First, create a Custom Web Control with the name DataPagerRepeater. Inherit it from Repeater and include the System.Web.UI.WebControls.IPageableItemContainer namespace (this requires that you add a reference to System.Web.Extensions).

Add this code:

C#
[ToolboxData("<{0}:DataPagerRepeater runat="server" 
   PersistentDataSource=true></{0}:DataPagerRepeater>")]

public class DataPagerRepeater : Repeater, 
       System.Web.UI.WebControls.IPageableItemContainer, INamingContainer
{

    public int MaximumRows { get { return ViewState["_maximumRows"] != null ? 
                                 (int)ViewState["_maximumRows"] : -1; } }
    public int StartRowIndex { get { return ViewState["_startRowIndex"] != null ? 
                              (int)ViewState["_startRowIndex"] : -1; } }
    public int TotalRows { get { return ViewState["_totalRows"] != null ? 
                               (int)ViewState["_totalRows"] : -1; } }

    public bool PersistentDataSource { 
        get { return ViewState["PersistentDataSource"] != null ? 
              (bool)ViewState["PersistentDataSource"] : true; }
        set { ViewState["PersistentDataSource"] = value; }
    }

    protected override void LoadViewState(object savedState)
    {
        base.LoadViewState(savedState);

        if (Page.IsPostBack)
        {
            if (PersistentDataSource && ViewState["DataSource"] != null)
            {
                this.DataSource = ViewState["DataSource"];
                this.DataBind();
            }
        }
    } 

    public void SetPageProperties(int startRowIndex, int maximumRows, bool databind)
    {
        ViewState["_startRowIndex"] = startRowIndex;
        ViewState["_maximumRows"] = maximumRows;

        if (TotalRows > -1)
        {
            if (TotalRowCountAvailable != null)
            {
                TotalRowCountAvailable(this, 
                   new PageEventArgs((int)ViewState["_startRowIndex"], 
                   (int)ViewState["_maximumRows"], TotalRows));
            }
        }
    }

    protected override void OnDataPropertyChanged()
    { 
        if (MaximumRows != -1)
        {
            this.RequiresDataBinding = true;
        }
        else
            base.OnDataPropertyChanged();
    }

    protected override void RenderChildren(HtmlTextWriter writer)
    {
        if (MaximumRows != -1)
        {
            foreach (RepeaterItem item in this.Items)
            {
                if (item.ItemType == ListItemType.Item || 
                    item.ItemType == ListItemType.AlternatingItem)
                {
                    item.Visible = false;

                    if (item.ItemIndex >= (int)ViewState["_startRowIndex"] && 
                        item.ItemIndex <= ((int)ViewState["_startRowIndex"] + 
                          (int)ViewState["_maximumRows"]))
                    {
                        item.Visible = true;
                    }
                }
                else
                {
                    item.Visible = true;
                }
            }
        }
        base.RenderChildren(writer);
    }

    public override void DataBind()
    { 
        base.DataBind();

        if (MaximumRows != -1)
        {
            int i = 0;
            foreach (object o in GetData())
            {
                i++;
            }
            ViewState["_totalRows"] = i;

            if(PersistentDataSource)
                ViewState["DataSource"] = this.DataSource;
            SetPageProperties(StartRowIndex, MaximumRows, true);
        }
    }

    protected override System.Collections.IEnumerable GetData()
    {
        return base.GetData();
    }

    public event System.EventHandler<PageEventArgs> TotalRowCountAvailable;
}

Build and use like this in an ASP.NET Form:

ASP.NET
<cc1:DataPagerRepeater ID="rep1" 
    runat="server" PersistentDataSource="true"> 
<HeaderTemplate > <div></HeaderTemplate> 
<ItemTemplate> 
 <div >
 <%# Eval("Value") %>
 </div>
 </ItemTemplate> 
<FooterTemplate></div></FooterTemplate> 
</cc1:DataPagerRepeater> 

<asp:DataPager ID="DataPager1" 
  PagedControlID="rep1" PageSize="2" runat="server">
<Fields>
<asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="True" 
   ShowNextPageButton="False" ShowPreviousPageButton="False" />

<asp:NumericPagerField />
<asp:NextPreviousPagerField ButtonType="Button" ShowLastPageButton="True" 
        ShowNextPageButton="False" ShowPreviousPageButton="False" />
</Fields>

</asp:DataPager>

And in the code-behind:

C#
protected void Page_Load(object sender, EventArgs e) 
{
    if(!IsPostBack)
    {
        System.Collections.SortedList SL = new System.Collections.SortedList();

        SL.Add("val1","Text1");
        SL.Add("val2","Text2");
        SL.Add("val3","Text3");
        SL.Add("val4","Text4");
        SL.Add("val5","Text5");
        SL.Add("val6","Text6");
        SL.Add("val7","Text7");
        SL.Add("val8","Text8");
        SL.Add("val9","Text9");

        rep1.DataSource = SL;
        rep1.DataBind();
    } 
}

That's all!

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior) Sigma IT & Management
Sweden Sweden
Working with web application development since 1999.
Developer of the CMS product Publech (www.publech.com) and a large range of other Publech modules.

Involved in developing the largest non commercial website in Sweden the Swedish Public Employment Service (www.ams.se)

Comments and Discussions

 
GeneralMy vote of 1 Pin
Sebastien Lorion27-May-10 5:56
Sebastien Lorion27-May-10 5:56 
GeneralSome changes new version Pin
Mr Orange7-Apr-10 6:11
Mr Orange7-Apr-10 6:11 
GeneralRe: Some changes new version Pin
Mr Orange7-Apr-10 6:38
Mr Orange7-Apr-10 6:38 
QuestionBug? [modified] Pin
ran920-Mar-10 11:56
ran920-Mar-10 11:56 
AnswerRe: Bug? [modified] Pin
xatazch6-Apr-10 1:22
xatazch6-Apr-10 1:22 
GeneralRe: Bug? Pin
ran96-Apr-10 8:29
ran96-Apr-10 8:29 
GeneralRe: Bug? Pin
Mr Orange7-Apr-10 6:12
Mr Orange7-Apr-10 6:12 
GeneralRe: Bug? Pin
xatazch9-Apr-10 0:32
xatazch9-Apr-10 0:32 
Cant download that file. can you please repost that one?
GeneralRe: Bug? Pin
Mr Orange21-Apr-10 5:50
Mr Orange21-Apr-10 5:50 
GeneralRe: Bug? Pin
ran96-Jun-10 9:47
ran96-Jun-10 9:47 
GeneralOne bug Pin
badalpatel9518-Mar-10 17:58
badalpatel9518-Mar-10 17:58 
GeneralRe: One bug Pin
Mr Orange7-Apr-10 6:15
Mr Orange7-Apr-10 6:15 
GeneralThanks Pin
Niladri_Biswas8-Feb-10 0:10
Niladri_Biswas8-Feb-10 0:10 
Generalin VB. Pin
B-One19-Jan-10 22:17
B-One19-Jan-10 22:17 
GeneralRe: in VB. Pin
B-One20-Jan-10 0:41
B-One20-Jan-10 0:41 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.