#659 - DataGrid con paginazione via URL

Nello script #557 abbiamo visto come modificare la status bar visualizzata sui link contenuti nel pager del DataGrid in modo da visualizzare la pagina sulla quale si desidera arrivare.
Lo script di oggi è una variante certamente più utile, perchè permette di ovviare ad uno dei limiti più fastidiosi di questo control, ovvero all'impossibilità di creare url che puntino direttamente ad una pagina specifica.
La modifica riguarda la cancellazione dell'evento di cambio pagina, che è gestito attraverso la querystring in fase di associazione dei dati, e la successiva aggiunta di una parte che intercetta l'evento ItemCreated, rimuove i LinkButton creati in automatico dal control ed aggiunge al loro posto dei nuovi control HtmlAnchor che puntano alla pagina corrente con l'aggiunta della pagina da selezionare in querystring.

// routine di estrazione dati

void bindData () {
  // effettuo il DataBinding sul control

  // connessione

  SqlConnection conn = new SqlConnection(connstring);

  // query

  SqlDataAdapter query = new SqlDataAdapter("SELECT * FROM sales", conn);

  // creo il dataset

  DataSet querydataset = new DataSet();
  query.Fill(querydataset);

  if (Request["p"] != null)
    myDataGrid.CurrentPageIndex = Convert.ToInt32(Request["p"])-1;

  myDataGrid.DataSource = querydataset;
  myDataGrid.DataBind();
}

private void myDataGrid_ItemCreated(object sender, DataGridItemEventArgs e)
{
  // solo se è il pager

  if (e.Item.ItemType == ListItemType.Pager) {

    // ricava url

    string url = Request.Url.ToString();

    // ripulisco pagina corrente

    url = url.Replace("p=" + Request["p"] + "&", String.Empty);
    url = url.Replace("?p=" + Request["p"], String.Empty);
    url = url.Replace("&p=" + Request["p"], String.Empty);
   
    url = String.Concat(url, (url.IndexOf("?")<0) ? "?":"&", "p={0}");

    // elenco tutti i controls all'interno

    TableCell pg = (TableCell) e.Item.Controls[0];

    // control con link

    HtmlAnchor h;
    LinkButton lb;
    for (int i = 0; i<pg.Controls.Count;i+=2) {
      // intercetto solo i LinkButton e li sostuisco

      if (pg.Controls[i].ToString().IndexOf("LinkButton") >=0) {
        // ricavo il numero di pagina

        lb = (LinkButton) pg.Controls[i];

        // nuovo collegamento HTML

        h = new HtmlAnchor();
        h.HRef = String.Format(url, lb.Text);
        h.InnerHtml = lb.Text;

        // rimuovo ed aggiungo nuovo control

        pg.Controls.RemoveAt(i);
        pg.Controls.AddAt(i, h);
      }
    }
  }
}

La modifica si occupa di non modificare la querystring, così da rendere possibile l'utilizzo di url come
http://localhost/search.aspx?key=ASP.NET
con all'interno un'eventuale chiave di ricerca con cui popolare la querystring.
Per riutilizzare al massimo il codice, è suggeribile creare un custom control.

Per approfondimenti si veda:

#557 - Modificare la status bar dei collegamenti del DataGrid di ASP.NET
http://www.aspitalia.com/liste/usag/script.aspx?ID=557

#625 - Introduzione alla creazione di Custom Control
http://www.aspitalia.com/liste/usag/script.aspx?ID=625

Nota: Questo script contiene un allegato.


Approfondimenti

Commenti

Esprimi il tuo giudizio su questo script:

Per procedere devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.




IN EVIDENZA
MISC