martedì 12 febbraio 2008

OnItemDataBound

Questo sconosciuto...

Un evento molto particolare che consente di ritoccare i dati in fase di Bound. Per comprendere con un po' più di chiarezza mi permetto di introdurre un esempio "classico".

Abbiamo una griglia, abbiamo degli elementi che popoleranno la griglia, tramite associazione DataSource.

La necessità e che l'utente finale possa eliminare i dati, rispondendo alla domanda "Ne sei davvero sicuro?".

Diciamo che nel novanta per cento dei casi l'utente non lo è, ed è per questo che si deve dare la possibilità di annullare
l'azione.

Immagino che tanti di voi abbiano provato in più di un occasione tentato di intromettersi nel sottile codice
di una grid view per poter operare una serie di aggiunte rischiando di rendere intricato il codice.

Una soluzione c'e', sfruttare l'evento di cui sopra.

Dopo aver associato i dati tramite
GridView.DataSource = [oggettoDati];
Si è soliti eseguire il
GridView.DataBind();
E' appunto in questa circostanza che si scatena l'evento

OnItemDataBound

Coinvolge tutti gli elementi presenti nella griglia, e naturalmente la griglia stessa.

protected void DataItemBound(object source, DataGridItemEventArgs e)
{
if ((e.Item.ItemType == ListItemType.Item) | (e.Item.ItemType == ListItemType.AlternatingItem))
{
LinkButton ln = (LinkButton)e.Item.Cells[5].Controls[0];
ln.Attributes.Add("onClick", "return(confirm('Sei sicuro di voler cancellare questo elemento?'))");
}
}




Il primo If (...) mi consente di lavorare esclusivamente sugli elementi (no su header, no su footer).

Nella mia gridview, nella colonna 5 ho un LinkButton che effettuerà la cancellazione dell'elemento
A detto controllo aggiungo un attributo "onClick" che verrà eseguito lato client.

Il valore dell'attributo non è altro che lo script che dovrà essere eseguito.

E' possibile applicare questa logica su tutti i controlli che naturalmente espongono OnItemDataBound o eventi simili che abbiano lo stesso comportamento.

Come è logico questo tipo di attività può notevolmente rallentare il render del controllo che stiamo utilizzando.
Ed è di conseguenza consigliato applicarlo ad un controllo che possa consentire la navigazione a pagine.

Nel mio caso mostro esclusivamente 15 elementi, è quindi comprensibile che questa struttura possa consentirmi una certa qualità.