Sì. Si deve usare un TemplateField, tuttavia non si può inserire direttamente al suo interno un controllo RadioButton, perché in questo modo non si ottiene il risultato voluto, dal momento che i radio button così creati non sono mutualmente esclusivi. Quello che serve è il controllo Literal:
<asp:GridView ID="GridView1" runat="server" OnRowCreated="GridView1_RowCreated">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Literal ID="RadioButtonMarkup" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Si devono poi inserire alcune routine nel code behind della pagina:
public int GetRadioButtonSelectedIndex(string radioButtonName)
{
if (string.IsNullOrEmpty(Request.Form[radioButtonName]))
return -1;
else
return Convert.ToInt32(Request.Form[radioButtonName]);
}
public void GridRowCreated(GridViewRow row, string markupControl, string radioButtonName)
{
if (row.RowType == DataControlRowType.DataRow)
{
//Recupera il riferimento al controllo Literal.
Literal output = (Literal)row.FindControl(markupControl);
//Aggiunge il markup per mostrare il RadioButton.
output.Text = string.Format("";
}
}
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
//Richiama il metodo che aggiunge il radiobutton.
this.GridRowCreated(e.Row, "RadioButtonMarkup", "RadioButtonGroup");
}
Nell’evento GridView1_RowCreated si richiama il metodo GridRowCreated, che prende un riferimento alla riga corrente ed inserisce un radio button nel Literal relativo. La routine GetRadioButtonSelectedIndex, invece, è utilizzata per recuperare l’indice dell’eventuale elemento selezionato. Ad esempio:
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write("Indice selezionato: " + this.GetRadioButtonSelectedIndex("RadioButtonGroup"));
}