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