Creare un DataPagerField per cambiare pagina con una DropDownList

di Marco Leoncini, in ASP.NET 3.5, ListView, DataBinding,

Il controllo DataPager fornisce l'infrastruttura necessaria a paginare i controlli che implementano l'interfaccia IPageableItemContainer, come ad esempio il ListView.

L'interfaccia per la navigazione tra le pagine non è fornita direttamente dal DataPager, ma dalla collezione di oggetti DataPagerField definiti nella collezione Fields, rendendo possibile visualizzare contemporaneamente più tipi di navigazione.

ASP.NET 3.5 è fornito di tre tipi di DataPagerField:
- NextPreviousPagerField: per visualizzare i classici pulsanti di navigazione avanti/indietro;
- NumericPagerField: visualizza un pulsante per ogni pagina;
- TemplatePagerField: per una completa personalizzazione.

Benchè sia possibile coprire gran parte degli scenari di paginazione con i controlli rilasciati, può in alcuni casi essere necessario fornire una propria interfaccia, nel nostro caso dovremo poter cambiare pagina selezionandola da un elenco.
Estendiamo quindi la classe astratta DataPagerField ed implementiamo i due metodi astratti che definisce: HandleEvent, per gestire gli eventi che si verificano all'interno del DapaPagerField, e CreateDataPagers, il cuore del nostro pager personalizzato, in quanto crea l'interfaccia di navigazione.

public override void CreateDataPagers( DataPagerFieldItem container, int startRowIndex, int maximumRows, int totalRowCount, int fieldIndex )
{
  //calcolo in numero di pagine necessarie 
  int _result = 0;
  int _itemNumber = Math.DivRem( totalRowCount, maximumRows, out _result );
  int _selectedItemindex = startRowIndex / maximumRows;

  if ( _result > 0 )
  {
    _itemNumber++;
  }

  DropDownList _dropDownList = new DropDownList();

  //per ogni pagina creo un item
  for ( int i = 1 ; i < _itemNumber + 1 ; i++ )
  {
    _dropDownList.Items.Add( new ListItem( i.ToString() ));
  }

  _dropDownList.AutoPostBack = true;

  //registo un event hadler per il cambio di pagina
  _dropDownList.SelectedIndexChanged += new EventHandler( _dropDownList_SelectedIndexChanged );
  
  //aggiungo la DropDownList al contenitore
  container.Controls.Add( _dropDownList );
  
  //imposto l'indice 
  _dropDownList.SelectedIndex = _selectedItemindex;
}

Nel metodo CreateDataPagers calcoliamo le pagine necessarie in base al numero di elementi visualizzati e al numero totale degli stessi, istanziamo una DropDownList e per ogni pagina creiamo infine un ListItem.
Continuiamo registrando un event handler per l'evento SelectedIndexChanged ed aggiungiamo la DropDownList nel suo contenitore.

void _dropDownList_SelectedIndexChanged( object sender, EventArgs e )
{
  int _page = -1;

  //recupero la pagina selezionata
  int.TryParse( ((DropDownList)sender).SelectedValue, out _page );

  if ( _page > -1 )
  {
    //e imposto la paginazione
    DataPager.SetPageProperties( ((_page -1) * DataPager.PageSize), DataPager.PageSize, true );
  }
}

Nel gestore dell'evento SelectedIndexChanged recuperiamo il valore selezionato dalla DropDownList ed utilizzando in metodo SetPageProperties, esposto dalla classe DataPager, impostiamo la pagina da visualizzare.

Nel metodo HandleEvent ci limiteremo a sollevare un'eccezione poiché il metodo non è utilizzato.
Non ci rimane che registrate il controllo ed utilizzarlo:

<%@ Register Namespace="MyControl" TagPrefix="My" %>
<asp:datapager ID="MyDataPager" runat="server">
  <Fields>
    <My:DropDownNumericPagerField /
  </Fields>
</asp:datapager>

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.

Approfondimenti

I più letti di oggi