Ho svolto un lavoro analogo su una DataList, che a sua volta non prevede la paginazione. Il metodo è quello di utilizzare la classe PagedDataSource.
protected PagedDataSource pds;
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
_BindData();
_BuildPageSelection();
}
}
//Loads all page numbers inside a DropDown
private void _BuildPageSelection()
{
int count = pds.PageCount;
for (int i = 0; i < count; i++)
{
ddlPages.Items.Add((i+1).ToString());
}
litPagesCount.Text = pds.PageCount.ToString();
}
//Retrieves data
protected void _BindData()
{
//PagedDataSource allows to implement paging for DataList
pds = new PagedDataSource();
//Gets all records
pds.DataSource = "...";
//Enables paging
pds.AllowPaging = true;
//Sets the current page (0 default, otherwise saved in the ViewState)
pds.CurrentPageIndex = CurrentPage;
//Number of record per page
pds.PageSize = 20;
//Binds data to the repeater
rep.DataSource = pds;
rep.DataBind();
}
//This page-level variable stores the Current viewed
//page in the page viewstate.
public int CurrentPage
{
get
{
//Look for current page in ViewState
object o = this.ViewState["_CurrentPage"];
if (o == null)
//Default page index is 0
return 0;
else
return (int)o;
}
set
{
this.ViewState["_CurrentPage"] = value;
}
}
//Performs page selection
protected void ddlPages_SelectedIndexChanged(object sender, EventArgs e)
{
CurrentPage = ddlPages.SelectedIndex;
_BindData();
}
I commenti sono in inglese per abitudine, comunque non dovrebbe essere problematico.
1) Si crea un PagedDataSource e vi si caricano tutti i record.
2) Si configura il PagedDataSource con pagina corrente, record per pagina...
3) Si associa il PagedDataSource al Repeater
È però necessario memorizzare la pagina attualmente visualizzata, e per farlo si ricorre ad una variabile a livello di pagina ("CurrentPage"), salvata nel ViewState.
Ultimo, gestire il cambio di pagina. Ho trovato che una DropDown con i numeri di pagina e AutoPostBack è una buona soluzione.
Spero possa essere d'aiuto...