Customizzare il pager del DataGrid

di Riccardo Golia, in UserScript, ASP.NET, C#,

Utilizzare la paginazione con le griglie di dati rappresenta spesso una scelta obbligata, data la numerosità delle informazioni da visualizzare e il poco spazio a disposizione sull'interfaccia utente. Per fortuna il controllo DataGrid prevede in maniera nativa alcuni meccanismi per gestire la paginazione senza scrivere troppo codice.
Esistono due modalità di rappresentazione del Pager, ovvero di quella sezione del controllo che permette di selezionare le opzioni di navigazione sulla griglia. Le due modalità sono: NextPrev, ovvero pulsanti avanti e indietro, e NumericPages, ovvero elenco numerico delle pagine.

Per estendere le possibilità offerte dalle due modalità menzionate, è possibile intercettare l'evento ItemCreated della DataGrid e aggiungere eventuali controlli a runtime. Il trucco sta nel rappresentare il Pager come una TableCell (tramite un cast) e ad essa aggiungere dinamicamente i controlli necessari per la customizzazione.

L'esempio proposto mostra come aggiungere ad un Pager di tipo NextPrev l'etichetta "Pagina di [n]" e i pulsanti di navigazione che permettono di aprire la prima e l'ultima pagina.

<script runat="server" language="C#">

private void Page_Load(object sender, System.EventArgs e)
{
  if(!this.IsPostBack)
    this.BindData();
}

private void BindData()
{
  // Ottieni i dati
  [...]

  // Data binding della griglia
  this.dgrAspitalia.DataSource = ds;
  this.dgrAspitalia.DataBind();
}

// Personalizza il pager
private void GridItemCreated(object sender, DataGridItemEventArgs e)
{
  // Pager
  if(e.Item.ItemType == ListItemType.Pager)
  {
    TableCell td = ((TableCell)e.Item.Controls[0]);

    // Numero di pagina
    Label lblPage = new Label();
    lblPage.Width = Unit.Pixel(150);
    lblPage.Height = Unit.Pixel(18);
    lblPage.Text =
      "Pagina " +
      (this.dgrAspitalia.CurrentPageIndex + 1) +
      " di " + this.dgrAspitalia.PageCount +
      "   ";
    td.Controls.AddAt(0, lblPage);

    // Prima pagina
    LinkButton lnkFirst = new LinkButton();
    lnkFirst.Text = "<<";
    if(this.dgrAspitalia.CurrentPageIndex == 0)
      lnkFirst.Enabled = false;
    lnkFirst.Click += new EventHandler(this.FirstClick);
    td.Controls.AddAt(1, lnkFirst);

    // Ultima pagina
    LinkButton lnkLast = new LinkButton();
    lnkLast.Text = ">>";
    if(this.dgrAspitalia.CurrentPageIndex == this.dgrAspitalia.PageCount-1)
      lnkLast.Enabled = false;
    lnkLast.Click += new EventHandler(this.LastClick);
    td.Controls.AddAt(5, lnkLast);

    // Pagina precedente
    if(this.dgrAspitalia.CurrentPageIndex == 0)
      ((Label)td.Controls[2]).Enabled = false;

    // Pagina successiva
    if(this.dgrAspitalia.CurrentPageIndex == this.dgrAspitalia.PageCount-1)
      ((Label)td.Controls[4]).Enabled = false;

    // Separatori
    Literal litSeparator1 = new Literal();
    litSeparator1.Text = " ";
    td.Controls.AddAt(2, litSeparator1);
    Literal litSeparator2 = new Literal();
    litSeparator2.Text = " ";
    td.Controls.AddAt(6, litSeparator2);
  }
}

// Vai alla prima pagina
private void FirstClick(object sender, EventArgs e)
{
  this.dgrAspitalia.CurrentPageIndex = 0;
  BindData();
}

// Vai all'ultima pagina
private void LastClick(object sender, EventArgs e)
{
  this.dgrAspitalia.CurrentPageIndex = this.dgrAspitalia.PageCount-1;
  BindData();
}

// Cambia pagina
private void PageClick(object sender, DataGridPageChangedEventArgs e)
{
  this.dgrAspitalia.CurrentPageIndex = e.NewPageIndex;
  BindData();
}

</script>
<asp:DataGrid ID="dgrAspitalia" Runat="server" AutoGenerateColumns="False"
  CellPadding="5" CellSpacing="0" BorderWidth="1" AllowPaging="True"
  PageSize="5" OnItemCreated="GridItemCreated" OnPageIndexChanged="PageClick">
  <HeaderStyle Font-Bold="True"></HeaderStyle>
  <PagerStyle Position="Bottom" Mode="NextPrev" PrevPageText="<"
    NextPageText=">" HorizontalAlign="Right"></PagerStyle>
  <Columns>
    <asp:BoundColumn DataField="Field1" HeaderText="Field1"></asp:BoundColumn>
    <asp:BoundColumn DataField="Field2" HeaderText="Field2"></asp:BoundColumn>
    <asp:BoundColumn DataField="Field3" HeaderText="Field3"></asp:BoundColumn>
    <asp:BoundColumn DataField="Field4" HeaderText="Field4"></asp:BoundColumn>
  </Columns>
</asp:DataGrid>

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