Il problema: molti non sanno che esistono modalità differenti per accedere ai dati di una colonna di una DataGrid associata ad una sorgente dati. Supponiamo di avere la seguente DataGrid contenente una colonna "Seleziona", una colonna Bound e una colonna Template:
/* CODICE 1 */
....
<asp:DataGrid id="dgIscritti" runat="server" AutoGenerateColumns="False" OnSelectedIndexChanged">
<Columns>
<asp:ButtonColumn Text="Seleziona" HeaderText="" CommandName="Select"/>
<asp:BoundColumn DataField="Name" HeaderText="Nome" />
<asp:TemplateColumn HeaderText="Cognome">
<ItemTemplate>
<%# Container.DataItem("Cognome") %>
<ItemTemplate/>
<Columns/>
<asp:DataGrid/>
<P> </P>
<P><STRONG><U>Selezione:</U></STRONG></P>
<P><STRONG>Nome:</STRONG> <asp:Label id="lblNome" runat="server"></asp:Label></P>
<P><STRONG>Cognome:</STRONG> <asp:Label id="lblCognome" runat="server"></asp:Label></P>
...
Il seguente codice funzionerà solo per la BoundColumn:
/* CODICE 2 */
....
Protected Sub SelectionChanged()
'Colonna Bound ...Questo funziona
lblNome.Text = dgIscritti.SeletedItem.Cells(1).Text
'Colonna Template...Questo non funziona
lblCognome.Text = dgIscritti.SelectedItem.Cells(2).Text
End Sub
...
Questo avviene perchè .NET vede il contenuto della BoundColumn come Text e il contenuto della TemplateColumn come un DataBoundLiteralControl. Infatti, .NET vede sempre i contenuti delle colonne Template come una collezione di server controls. Per impostare correttamente la proprietà Text di lblCognome, si dovrà accedere alla proprietà Text del DataBoundLiteralControl. Ciascuna cella ha una collezione di Controlli ai quali noi possiamo accedere. Bisogna tenere in mente che questa collezione ritorna un oggetto di tipo Control, così si dovrà convertirlo al tipo che si vorrà utilizzare; in questo caso un DataBoundLiteralControl. Ecco come fare:
/* CODICE 3 */
....
Protected Sub SelectionChanged()
'Bound Column...Questo funziona
lblNome.Text = dgIscritti.SelectedItem.Cells(1).Text
lblCognome.Text = CType(dgIscritti.SelectedItem.Cells(2).Controls(0).DataBoundLiteralControl).Text
End Sub
...