Posso visualizzare dei RadioButton accanto alle righe di una GridView?

Utente HTML.it
chiede

Posso visualizzare dei RadioButton accanto alle righe di una GridView?

Redazione HTML.it
risponde

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("

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"));
}