Paginare un repeater

di Stefano Mostarda, in .NET,

La semplicità e la potenza del DataGrid spesso nascondono quelli che sono i problemi di questo controllo (lentezza, pesantezza del ViewState, output poco personalizzabile). Il vero problema è che spesso i problemi che questa crea non sono nemmeno considerati dallo sviluppatore (Funziona?? Si!! Allora tutto a posto). Quando si devono creare applicazioni "serie", il controllo ideale è il repeater. Questo però non offre le stesse potenzialità di servizi del fratello maggiore. (Paging e Sorting).
Il sorting è una feature abbastanza semplice da implementare, inserendo degli HyperLink nella sezione HeaderTemplate. Per il paging la cosa è altrettanto semplice da implementare, ma va ripetuta allo sesso modo su ogni Repeater dell'applicazione.
Daniele qui ha dato la sua idea su come migliorare le cose. Lui sfrutta i parametri passati nell'url per effettuare la paginazione, io invece propongo un CustomControl che esegue un PostBack della pagina.

L'idea, come per lo script di Daniele, non è quella di iniettare dei controlli nel Repeater, bensì di creare un secondo controllo completamente indipendente che si può mettere ovunque. 
Il controllo deriva da PlaceHolder, implementa INamingContainer ed espone 2 proprietà e un evento. La prima proprietà indica il numero attuale della pagina, e la seconda il numero totale di pagine. L'evento notifica quando si è effettuato il cambio di pagina passando come parametro una classe che deriva da EventArgs che in più espone il nuovo numero di pagina (Stesso metodo del datagrid). Il metodo CreateChildControls viene overridato per riprodurre lo stato dei controlli creati dinamicamente nella precedente richiesta e far scattare così gli eventi in maniera corretta. Infine viene overridato anche il metodo Render per ridisegnare gli oggetti in base al numero di pagina specificato nell proprietà.

La parte core del controllo è quella che crea i bottoni per la paginazione.

private void FillPager(){
 this.Controls.Clear();
 for (int i = 0; i < PageCount; i++){
  if ((i + 1) == PageIndex){
   LiteralControl l = new LiteralControl();
   l.Text = Convert.ToString(i + 1);
   this.Controls.Add(l);
  }
  else{
   LinkButton l = new LinkButton();
   l.Text = Convert.ToString(i + 1);
   l.ID = this.UniqueID + "lk" + i;
   l.CommandArgument = l.Text;
   this.Controls.Add(l);
  }
  this.Controls.Add(new LiteralControl(" "));
 }
}

Nel prossimo post ci sarà anche la parte relativa al sollevamento dell'evento.

Stay tuned...

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese