MutuallyExclusiveRadioButton

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

Print

Comments on this entry:

# re: MutuallyExclusiveRadioButton

Left by M.rkino at 05/06/2006 19:02
Gravatar
Il codice è scritto in c# per. Il punto (1) è l'implementazione della classe/controllo per cui il codice va messo in un classe di codebehind e/o in una libreria. Il punto (3) è relativo al codice di codebehind della pagina "disegnata" nel punto (2).

# re: MutuallyExclusiveRadioButton

Left by Denis at 01/10/2009 21:14
Gravatar
But there is another problem. Control doesn't restores its viewstate after postback

# re: MutuallyExclusiveRadioButton

Left by markino at 06/10/2009 00:45
Gravatar
@Densi ty for your feedback. I am sorry the code is posted AS IS. Feel free to extend the feature of my code... I implemented just the use cases I needed.
Comments have been closed on this topic.
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011