37 votes

ASP.NET RadioButton jouant avec le nom (nom de groupe)

Je me suis basé sur un modèle de contrôle (répéteur) inscription du texte et d'autres marques. Chaque élément dispose d'un bouton radio associé, ce qui permet à l'utilisateur de sélectionner l'UN des éléments créés par le répéteur.

Le répéteur écrit le radiobutton réglage de son nom et l'identifiant généré par défaut ASP.NET la convention de nommage de la fabrication de chaque composant radiobutton complet d'un 'groupe'. Cela signifie que tous les composants radiobutton sont indépendants les uns des autres, qui, là encore, malheureusement, je peux sélectionner tous les composants radiobutton dans le même temps. Le radiobutton a l'habile attribut "groupname" utilisé pour définir un nom commun, de sorte qu'ils sont regroupés, et devrait donc être à charge (donc je ne peut sélectionner qu'une seule à la fois). Le problème est - ce qui ne fonctionne pas - le répéteur permet de s'assurer que l'id et le nom (qui contrôle le groupement) sont différentes.

Depuis que j'ai utiliser un répéteur (qui pourrait avoir été une listview ou de tout autre basées sur des modèles de contrôle lié aux données) je ne peux pas utiliser le RadioButtonList. D'où vient donc que de me laisser?

Je sais que j'ai eu ce problème avant et résolu. Je sais que presque tous les ASP.NET programmeur doit en avoir trop, alors pourquoi ne puis-je pas google et de trouver une solution solide pour le problème? Je suis tombé sur les solutions à appliquer le regroupement par JavaScript (laid!) ou même pour gérer les composants radiobutton non-contrôles serveur, m'obligeant à faire un Request.Form[name] pour lire l'état. J'ai aussi essayé d'expérimenter avec des raisons impérieuses le nom de l'attribut dans l' PreRender cas - malheureusement, le propriétaire de la page et masterpage nouveau remplace ce nom afin de refléter la pleine id/nom, donc je me retrouve avec le même mauvais résultat.

Si vous n'avez pas de meilleure solution que ce que j'ai posté, vous êtes toujours les bienvenus pour poster vos pensées - au moins je saurai que mon ami "jack" est à droite sur la façon foiré ASP.NET est parfois ;)

7voto

Cristian Libardo Points 7425

Google-fu: problème de répéteur de radiobutton asp.net

En effet une conséquence malheureuse de la mutilation id. Ma prise serait de créer un - ou de choisir l'un des nombreux contrôles personnalisés disponibles - qui ajoute la prise en charge du même nom sur le client.

7voto

Chris Magnuson Points 1009

Vladimir Smirnov a déjà créé un excellent contrôle personnalisé qui résout ce problème. Nous utilisons le GroupRadioButton dans nos projets et il fonctionne parfaitement avec les boutons radio créés à l'intérieur d'un répéteur et d'autres à l'extérieur du répéteur faisant tous partie du même groupe.

5voto

KitFox Points 352

Je sais que c'est un vieux post, mais voici ce que j'ai fait avec un contrôle listview. Mon listview est lié en VB code-behind, donc je ne suis pas sûr si cela fonctionne bien avec un répéteur, mais j'imagine que ça pourrait être similaire.

Ce que j'ai fait a été de gérer la OnCheckChanged cas de composants radiobutton avec une fonction non sélectionnée tout les autres boutons radio. Puis j'ai cherché le bouton d'option sélectionné lorsque je navigue à l'écart de la page.

Cette solution évite de JavaScript et jQuery, et ignore les GroupName problème complètement. Ce n'est pas idéal, mais il fonctionne comme (I) attendu. J'espère que c'est utile pour les autres.

Balisage:

<asp:ListView ID="lvw" runat="server">
  <LayoutTemplate>`
    <table>
      <th>Radio</th>
      <tr id="itemPlaceholder"></tr>
    </table>
  </LayoutTemplate>
  <ItemTemplate>
    <tr>
      <td><asp:RadioButton ID="rdbSelect" runat="server" AutoPostBack="true"
           OnCheckedChanged="rdbSelect_Changed"/></td>
    </tr>
  </ItemTemplate>
</asp:ListView>

Code:

Protected Sub rdbSelect_Changed(ByVal sender As Object, ByVal e As System.EventArgs)

  Dim rb1 As RadioButton = CType(sender, RadioButton)

  For Each row As ListViewItem In lvw.Items
    Dim rb As RadioButton = row.FindControl("rdbSelect")
      If rb IsNot Nothing AndAlso rb.Checked Then
         rb.Checked = False
      End If
  Next
  rb1.Checked = True
End Sub

Et puis quand le bouton "Soumettre" est cliqué:

Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs)  Handles btnSubmit.Click

  For Each row As ListViewItem In lvw.Items
    Dim rb As RadioButton = row.FindControl("rdbSelect")
        Dim lbl As Label
        If rb IsNot Nothing AndAlso rb.Checked = True Then
            lbl = row.FindControl("StudentID")
            Session("StudentID") = lbl.Text
        End If
    Next

    Response.Redirect("~/TransferStudent.aspx")
End Sub

3voto

tbilly Points 51

Cela pourrait être un peu mieux ..

J'ai un usercontrol qui est essentiellement un ensemble de boutons radio à l'intérieur d'un répéteur, chaque instance de l'usercontrol a une propriété publique appelée FilterTitle, qui est unique par instance.

ajoutez ces deux propriétés à votre radiobutton en remplaçant FilterTitle par votre propre nom de propriété publique

 onclick='<%# "$(\"input[name$=btngroup_" + FilterTitle + "]\").removeAttr(\"checked\"); $(this).attr(\"checked\",\"checked\");" %>' GroupName='<%# "btngroup_" + FilterTitle  %>'
 

plus simplement..

 onclick="$('input[name$=btngroup1]').removeAttr('checked'); $(this).attr('checked','checked');" GroupName="btngroup1"
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X