Intercettare la creazione di ogni cella del DataGrid

di Lino Mari, in UserScript, ASP.NETVB.NET,

Nello script seguente si può notare la potenza e la flessibilità dell'utilizzo dell'evento OnItemDataBound: associando a questo evento un metodo, esso viene richiamato per ogni item (riga di dettaglio) creato.
Lo script prevede l'estrazione dei dati da un database, richiamando la subroutine BindDataGrid() che associa i dati al DataGrid "Elenco".

Il DataGrid prevede anche la paginazione (non è il tema dell'esempio) ma la parte importante è contenuta nel metodo ItemDataBound(), che aggiunge degli attributi alle righe della tabella generata dal DataGrid.
Nel caso specifico servono a creare un effetto al passaggio del mouse sulle righe, ovvero viene modificato il colore di sfondo, in modo da selezionare la riga interessata. Una volta che il mouse si sposta il colore ritorna al valore precedente.

Un'altra cosa importante è la possibilità di intercettare i valori delle singole celle: nel caso specifico viene utilizzato un esempio molto banale ma sicuramente molto potente.
Viene modificato il valore della seconda colonna (il parametro è 1 perchè zero-based). Al contenuto della cella viene aggiunto staticamente un link. E' possibile fare lo stesso dinamicamente andando a pescare il dato in un database.

<SCRIPT RUNAT="SERVER" LANGUAGE="VB">

sub BindDataGrid()
  Dim objDS As New DataSet()
  dim conn as SQLconnection = new SQLconnection (stringa di connessione...)
  
  strSQL = "SELECT..."

  Dim objDataAdapter As New SQLDataAdapter(strSQL, conn)
  objDataAdapter.Fill(objDS, "contatti")

  Elenco.DataSource = objDS.Tables(0).DefaultView
  Elenco.DataBind()

  'totale pagine
  lblPagine.InnerHTML = "numero dipagine: <b>" & Elenco.PageCount & "</b>" 'associato ad un tag DIV (runat=server)
  
  conn.close()

end sub


Sub ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs)
  
  'esegue solo per gli item
  If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then

    'aggiunge per ogni riga gli attributi di tipo style
    e.Item.Attributes.Add("onmouseover", "this.style.backgroundColor='Silver'")

    'esegue nel caso di item alternativo (righe dispari)
     if e.Item.ItemType = ListItemType.AlternatingItem
      e.Item.Attributes.Add("onmouseout", "this.style.backgroundColor='#DDD'")
    else
      e.Item.Attributes.Add("onmouseout", "this.style.backgroundColor='#EEè")
    end if

    'modifica il contenuto di una cella di dettaglio creando un link
    e.Item.Cells(1).Text = "<a href='quello che vuoi' class='stilè title='quello che vuoi'>" + e.Item.Cells(1).Text + "</a>"
  end if

End Sub


Sub PageIndexChanged_onclick(objSender As Object, objArgs As DataGridPageChangedEventArgs)
  
  ' imposta il numero di pagina
  Elenco.CurrentPageIndex = objArgs.NewPageIndex
  
  'Pagina di riferimento
  lblPagine.InnerHTML = "Pagina <b>" & objArgs.NewPageIndex+1 & "</b>"

  ' effettua di nuovo il binding dei dati
  BindDataGrid()

End Sub

</SCRIPT>
<form runat="server">
<div id="lblPagine" class="stile" runat="server" />
<ASP:DataGrid id="Elenco" runat="server"
  OnItemDataBound="ItemDataBound"
  CellPadding="2"
  ShowHeader="true"
  BorderColor= "#000000"
  BackColor = "#EEEEEE"
  HeaderStyle-BackColor= "#777777"
  HeaderStyle-CssClass= "intestazione"
  ItemStyle-verticalalign="Top"
  ItemStyle-CssClass = "piccolo"
  AlternatingItemStyle-BackColor="#DDDDDD"
  Border="1"
  PagerStyle-Mode="NumericPages"
  PagerStyle-HorizontalAlign="Right"
  PagerStyle-position="TopAndBottom"
  PagerStyle-CssClass="paginazione"
  OnPageIndexChanged="PageIndexChanged_OnClick"
  width="100%"
  AutoGenerateColumns="true" >
</ASP:DataGrid>
</form>

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