2010-10-27 5 views
6

J'ai un contrôle de répéteur dans ma page. Je dois avoir un bouton radio dans toutes les lignes (modèle d'élément) en vérifiant un bouton radio les boutons radio restants doivent être décochés.liste de boutons radio dans le contrôle de répéteur

Comment faire?

Merci à l'avance, Tor

Répondre

1

ajouter juste un événement OnCheckedChanged au bouton radio, boucle tous les boutons radio du répéteur pour les décocher. Vous pouvez utiliser UpatePanel si vous ne voulez pas de publication.

.aspx

<asp:Repeater ID="Repeater1" runat="server" > 
    <ItemTemplate> 
     <asp:RadioButton ID="RadioButton1" runat="server" OnCheckedChanged="RadioButton1_OnCheckedChanged" AutoPostBack="true" /> 
    </ItemTemplate> 
</asp:Repeater> 

.cs

protected void RadioButton1_OnCheckedChanged(object sender, EventArgs e) 
{ 
    foreach (RepeaterItem item in Repeater1.Items) 
    { 
     RadioButton rbtn = (RadioButton)item.FindControl("RadioButton1"); 
     rbtn.Checked = false; 
    } 
    ((RadioButton)sender).Checked = true; 
} 
+1

Pour l'exemple ci-dessus, si vous ajoutez la propriété "GroupName" pour le contrôle , Il va ajouter tous les radioButton sous le même groupe de sorte qu'un seul bouton radio sera sélectionné. – Shivkant

+0

oh ouais .. nous devrions utiliser cela à la place! – bla

+0

Un UpdatePanel provoquera toujours un postback, juste que ce sera une publication ajax. Il faudra encore du temps car il doit acheminer vers/depuis le serveur. – nealkernohan

10

Malheureusement, il est un bug connu (http://support.microsoft.com/kb/316495) que la propriété GroupName ne fonctionne pas comme prévu lorsqu'il est utilisé dans un répéteur . Le problème est que le répéteur implémente l'interface INamingContainer qui exige que tous les contrôles imbriqués aient un nom unique lorsqu'il est rendu au format HTML. Cela provoque la rupture des boutons radio car, pour qu'ils fonctionnent correctement, ils doivent avoir les mêmes noms .

Il y a 2 contournements que j'ai rencontré:

1 - Le premier est un javascript côté client solution. Il a été fourni par Microsoft support. Ou une version plus facile à lire here. Les instructions sont les suivantes. Inclure le javascript suivant dans le HEAD:

function SetUniqueRadioButton(nameregex, current) 
{ 
     re = new RegExp(nameregex); 
     for(i = 0; i < document.forms[0].elements.length; i++) 
     { 
      elm = document.forms[0].elements[i] 
      if (elm.type == 'radio') 
      { 
        if (re.test(elm.name)) 
        { 
          elm.checked = false; 
        } 
      } 
     } 
     current.checked = true; 
} 

Maintenant, la fonction doit être liée aux boutons radio en cas OnDataItemBound du répéteur. Remplacer « RadioButton » avec le nom de votre contrôle RadioButton et « RadioGroup » avec le nom de groupe que vous avez choisi:

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
     if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) return; 
     RadioButton rb = (RadioButton) e.Item.FindControl("RadioButton"); 
     string script = "SetUniqueRadioButton('Repeater1.*RadioGroup',this)"; 
     rb.Attributes.Add("onclick", script); 
} 

2 - La deuxième solution est une solution côté serveur à l'aide d'un UserControl personnalisé qui hérite de RadioButton. Le tutoriel et le code source peuvent être téléchargés ici: http://www.codeproject.com/KB/webforms/How_group_RButtons.aspx

0

Je sais que c'est vieux, mais la raison pour laquelle les boutons ne fonctionnent pas, c'est parce que l'attribut name est en train d'être écrasé. Si vous utilisez jQuery, vous pouvez affecter le bouton radio à une classe puis définir l'attribut name pour remplacer le nouveau nom.

$('.MyRadioClass').attr("name","MyFixedName"); 
0

Une autre alternative plus simple, où aucune mise en forme de fantaisie est nécessaire, est d'utiliser un RadioButtonList:

<asp:RadioButtonList ... />