Un problema tristemente noto è quello legate ai RadioButton in elementi di controlli ripetitivi, datagrid, datalist, etc... Sul support di MSDN è presente anche un articolo "BUG: Radio Buttons Are Not Mutually Exclusive When Used in a Repeater Server Control", http://support.microsoft.com/kb/316495/EN-US/ , con tanto di spiegazione dle problema ma senza nessuna soluzione oproposta di soluzione alla cosa. In questi giorni mi sono trovato a ripondere ad un post sul forum... e ho decisono di perderci qualche ora per vedere di trovare una possibile solzuione, che poi non ho nemmeno guardato in rete per veder se qualcuno aveva risolto in un qlke modo. Comunque ecco la mia solzuzione che riporto a grandi linee come riportata sul Forum, http://forum.ugidotnet.org/default.asp?m=49141
1. Implemento MutuallyExclusiveRadioButton che estende RadioButton e corregge il problema ridefininendo il metodo di rerder iniettando un HtmlTextWriter in grado di correggere il problema.
[ToolboxData("<{0}:MutuallyExclusiveRadioButton runat=server>")]
public class MutuallyExclusiveRadioButton: RadioButton
{
#region FixRadioGroupHtmlTextWriter
protected class FixRadioGroupHtmlTextWriter: HtmlTextWriter
{
string groupName ;
public FixRadioGroupHtmlTextWriter(string groupName,HtmlTextWriter writer):base(writer){
this.groupName = groupName;
}
public override void AddAttribute(HtmlTextWriterAttribute key, string value)
{
if(key == HtmlTextWriterAttribute.Name)
{
value = groupName;
}
base.AddAttribute (key, value);
}
}
#endregion
protected override void Render(HtmlTextWriter writer)
{
base.Render(new FixRadioGroupHtmlTextWriter(this.GroupName, writer));
}
}
2. Creo un nuovo progetto in cui aggiunto un web form per fare i test del controllo. Aggiungo la griglia sul mio web form e definisco una Template Column dove vado a inserire il mio nuovo RadioButton come segue.
<asp:DataGrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 208px; POSITION: absolute; TOP: 56px"
runat="server">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<cc1:MutuallyExclusiveRadioButton Text="Seleziona" ID="radioGroup" Runat="server" GroupName="radioGroup"></cc1:MutuallyExclusiveRadioButton>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
3. Aggiungo un bottone e una label e implemento la parte di codebind per fare qualche test.
public class MutuallyExclusiveRadioButtonPage : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.DataGrid DataGrid1;
string selectedRadioGroupValue = string.Empty;
private void FillDataGrid()
{
string[] files = System.IO.Directory.GetFiles(@"\");
DataGrid1.DataSource = files;
DataGrid1.DataBind();
}
private void Page_Load(object sender, System.EventArgs e)
{
if(IsPostBack)
{
selectedRadioGroupValue = Request.Form["radioGroup"];
}
FillDataGrid();
}
[region Web Form Designer generated code]
private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
RadioButton radio = (RadioButton)e.Item.Cells[0].FindControl("radioGroup");
string value = e.Item.DataItem.ToString();
radio.Attributes["value"] = value;
if(selectedRadioGroupValue == value)
{
radio.Checked = true;
}
}
}
private void Button1_Click(object sender, System.EventArgs e)
{
Label1.Text = selectedRadioGroupValue;
}
}
Il risultato ottenuto è quello che mi ero dato come obbiettivo: la colonna del datagrid contiene dei radio button mutuamente esclusivi. Ovviamente lo stato del controlli è da gestire esplicitamente un pò come si faceva in ASP. Non è che le cose vecchie vanno tutte buttate via ;-p La soluzione è certo non banale ma mi sembra solida, che dite?
posted @ sabato 5 marzo 2005 17:08