Click here to Skip to main content
Click here to Skip to main content

Extend Repeater to support DataPager

, 21 Oct 2011 CPOL
Rate this:
Please Sign up or sign in to vote.
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:

[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:

<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:

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)

Share

About the Author

Mr Orange
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

 
QuestionBug Fix? PinmemberSteve M Anderson1-Oct-13 7:41 
SuggestionGuide when not using presistentDataSource or when using datasource paging PinmemberMr Orange25-Jun-13 5:06 
Questionits working very well but taking too much time server Pinmembernavnit.8825-Jun-13 1:12 
AnswerRe: its working very well but taking too much time server PinmemberMr Orange25-Jun-13 2:30 
GeneralRe: its working very well but taking too much time server Pinmembernavnit.8825-Jun-13 2:51 
GeneralRe: its working very well but taking too much time server PinmemberMr Orange25-Jun-13 3:47 
GeneralRe: its working very well but taking too much time server Pinmembernavnit.8825-Jun-13 3:59 
GeneralRe: its working very well but taking too much time server PinmemberMr Orange25-Jun-13 4:49 
The following code will guide you to how to work with databind when not using presistentDataSource
In default.aspx.cs (the codebehind file) of the download example.
Replace entire page code with this and you see how it works.

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
public partial class _Default : System.Web.UI.Page 
{
    //Store current page item index (to minimize extra dataloads)
    private int currentIndex;
 
    protected void Page_Load(object sender, EventArgs e)
    {
        //**2 events required when PersistentDataSource = false or when using datasource paging
        //Runs on all postbacks
        rep1.FetchingData += new EventHandler<PageEventArgs>(rep1_FetchingData);
        //Runs on every page load/posback
        rep1.PreRender += new EventHandler(rep1_PreRender);
 
        
        if
        (!IsPostBack)
        {
            rep1.PersistentDataSource = false;
 
            //this is the fake database or other data source
            System.Collections.SortedList SL = new System.Collections.SortedList();
 

            ////***DATASOURCE PAGING***
            //rep1.PagingInDataSource = true;
            ////filter initial load to contain only first page data eg. Select top 2 * from SOMETABLE
            //SL.Add("val0", "Text0");
            //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");
            ////SL.Add("val10", "Text10");
            
            ////YOU NEED TO OBTAIN TOTAL ROWS WITHOUT PAGING SINCE DATASOURCE ONLY CONTAINS FILTERED (in this 2) ROWS
            //rep1.TotalRows = 11;

 
            //**PAGING IN REPEATER ALWAYS LOAD DATA PersistentDataSource = false; 
            rep1.PagingInDataSource = false;
            SL.Add("val0", "Text0");
            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");
            SL.Add("val10", "Text10");
 
            rep1.DataSource = SL;
            rep1.DataBind();
 
        }
    }
 

    protected void rep1_TotalRowCountAvailable(object sender, PageEventArgs e)
    {
 
    }
 

    protected void rep1_FetchingData(object sender, PageEventArgs e)
    {
        //Store current page item index (to minimize extra dataloads)
        currentIndex = rep1.StartRowIndex;
 
        
        //Rebind data on postback so controls in pager are availabel
        //Here you need to get the current page data before you clicked any buttons 
        //So the page will render ok again and you can acess controls in the repeater

 
        ////***DATASOURCE PAGING***
        ////HERE YOU NEED TO SET YOUR OWN DATASOURCE PAGING LOGIC SO YOU ONLY!! RETURN CURRENT PAGE ITEMS!!!!!
        ////rep1.StartRowIndex = startrow to get from datasource eg 15. MaximumRows = rows on each page eg 5 (then you get row 15 to 20 from datasource) 
        ////this is the fake database or other data source
        //System.Collections.SortedList SL = new System.Collections.SortedList();
        //for (int i = 0; i < rep1.MaximumRows; i++)
        //{
        //    SL.Add("val" + (rep1.StartRowIndex + i).ToString(), "Text" + (rep1.StartRowIndex + i).ToString());
        //}

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

        //**PAGING IN REPEATER ALWAYS LOAD DATA PersistentDataSource = false; 
        System.Collections.SortedList SL = new System.Collections.SortedList();
        SL.Add("val0", "Text0");
        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");
        SL.Add("val10", "Text10");
        rep1.DataSource = SL;
        rep1.DataBind();
 
    }
 
    void rep1_PreRender(object sender, EventArgs e)
    {
        //Here you get the new rowindex after paging
        //If currentIndex == rep1.StartRowIndex you already have loaded the data (on first pageload or in rep1_FetchingData on postback)
        //if currentIndex != rep1.StartRowIndex then the pageing have changed

        if (currentIndex != rep1.StartRowIndex)
        {
            ////***DATASOURCE PAGING***
            //System.Collections.SortedList SL = new System.Collections.SortedList();
            //for (int i = 0; i < rep1.MaximumRows; i++)
            //{

            //    SL.Add("val" + (rep1.StartRowIndex + i).ToString(), "Text" + (rep1.StartRowIndex + i).ToString());

            //}

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

            //**PAGING IN REPEATER ALWAYS LOAD DATA PersistentDataSource = false; 
            System.Collections.SortedList SL = new System.Collections.SortedList();
            SL.Add("val0", "Text0");
            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");
            SL.Add("val10", "Text10");
            rep1.DataSource = SL;
            rep1.DataBind();
        }
    }
 

    protected void Button1_Click(object sender, EventArgs e)
    {
 
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
   
    }
}

GeneralRe: its working very well but taking too much time server Pinmembernavnit.8825-Jun-13 19:00 
GeneralRe: its working very well but taking too much time server PinmemberMr Orange25-Jun-13 4:30 
QuestionHierarchy repeater PinmemberTyng17-Jan-13 13:12 
BugI think, logic is not valid. PinmemberMikhail Polyakov7-Sep-12 1:37 
GeneralRe: I think, logic is not valid. PinmemberMr Orange25-Jun-13 2:37 
Questioni can not use it Pinmembersara zo18-Aug-12 0:21 
AnswerRe: i can not use it PinmemberMr Orange21-Aug-12 5:06 
GeneralMy vote of 4 Pinmemberkiran dangar21-Oct-11 20:03 
QuestionSqlDataReader PinmemberSkillZ9119-Oct-11 6:51 
AnswerRe: SqlDataReader PinmemberMr Orange23-Oct-11 21:57 
Generalone step behind PinmemberMember 778573324-May-11 1:19 
GeneralRe: one step behind PinmemberMr Orange26-May-11 21:54 
GeneralFantastic work Pinmemberkcabrams22-Sep-10 9:44 
QuestionPagingInDataSource Issue PinmemberChadBoettcher29-Jun-10 15:15 
AnswerRe: PagingInDataSource Issue PinmemberChadBoettcher26-Jul-10 18:52 
GeneralDataPagerRepeater inside UpdatePanel Pinmemberran97-Jun-10 11:49 
GeneralRe: DataPagerRepeater inside UpdatePanel PinmemberMr Orange7-Jun-10 22:47 

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

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

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.1411023.1 | Last Updated 21 Oct 2011
Article Copyright 2009 by Mr Orange
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid