Un effetto molto carino è permettere di selezionare una riga di una griglia senza utilizzare la colonna specifica creata nativamente dalla GridView, ma cliccando sulla riga stessa.

L’idea è quella di replicare il codice che verrebbe generato in automatico dalla GridView, ed attaccarlo all’evento click della riga stessa, che non è altro che una riga di una tabella (<tr>).

Vediamo come sarebbe il codice autogenerato per la griglia GridView1 nella prima riga:

javascript:__doPostBack('GridView1','Select$0')"

Questo è il codice che ci serve. Ora dobbiamo metterlo al posto giusto e magari aggiungiamo qualche abbellimento grafico:

protected override void Render(HtmlTextWriter writer)
{
    foreach (GridViewRow row in GridView1.Rows)
    {
        if (row.RowType == DataControlRowType.DataRow)
        {
            row.Attributes["onclick"] = ClientScript.GetPostBackClientHyperlink(GridView1, "Select$" + row.DataItemIndex, true);
            row.Attributes["onmouseover"] = "this.className='selectRow';";
            row.Attributes["onmouseout"] = "this.className='normalRow';";

        }
    }
    base.Render(writer);
}

Come potete vedere, sfruttando l’evento Render della pagina, aggiungiamo il codice che abbiamo visto all’evento client “onclick” di ogni riga della griglia utilizzando ClientScript.GetPostBackClientHyperlink.
I parametri per questo metodo sono: il controllo dal quale viene lanciato l’evento, i parametri per l’evento (in questo caso Select$ + numero di riga), un valore booleano che specifica di validare il postBack lanciato dal client.
Lascio ad ognuno la scelta degli stili da mettere nelle due classi “SelectRow” e “normalRow”

Precisazioni

Leggendo vari post, ho visto diverse affermazioni non proprio precise:

    • row.Attributes[“onmouseover”] = “this.style.className=’selectRow’;”
      className” non è una proprietà di “style” ma dell’elemento html stesso
    • La feature viene implementata nell’evento RowCreated o RowDataBound della griglia
      Si può fare in effetti anche sull’evento RowCreated, ma con un piccolo inconveniente: non possiamo validare l’evento.
      Come avete letto prima, il terzo parametro del metodo GetPostBackClientHyperlink serve a validare l’evento lanciato. Purtroppo la validazione si può richiamare soltanto nel metodo Render della pagina, quindi usando RowCreated bisogna omettere questo terzo parametro. L’effetto è un errore lato server. Per ovviare siamo costretti a disabilitare la validazione a livello di direttiva:
<%@ Page EnableEventValidation="false" %>

Punti d’interesse e miglioramenti

Naturalmente questa è una soluzione veloce e semplice, che possiamo migliorare ad esempio creando un controllo custom, che eredita dalla classe GridView ed implementa questa feature. O ancora possiamo utilizzare javascript per permettere la selezione multipla, simile all’utilizzo de CheckBox come ad esempio nelle webmail.

In caso di griglie che non contengono semplici dati, questa soluzione potrebbe impedire l’interazione con le celle che contengono controlli e/o link. È possibile risolvere implementando la feature sulle singole celle e non su tutta la riga. In questo modo possiamo controllare il contenuto della cella ed escludere i controlli che hanno bisogno di interazione.

Alcune soluzioni possibili si possono trovare ai seguenti link:
http://www.codeproject.com/KB/aspnet/GridviewExtender.aspx
http://www.webswapp.com/categories/ASPNET2/gridview_multiplerows_selection/Default.aspx
https://msmvps.com/blogs/deborahk/archive/2010/01/25/asp-net-selecting-a-row-in-a-gridview.aspx

.