2009-08-26 10 views
28

Ich habe derzeit ein Problem mit Optionsfeldern und Gruppierung. Ich habe eine Asp Radio-Taste in einem Repeater-Steuerelement. Ich habe das Gruppennamensattribut auf "Kunde" gesetzt. Wenn die Seite geladen wird, sind die Optionsfelder nicht gruppiert. Anstatt die ID-Felder auf den Gruppennamen zu setzen, werden die Wertefelder der Optionsfelder festgelegt. Ich weiß, dass ich versucht habe, Radio-Tasten außerhalb einer Repeater-Kontrolle zu setzen und hatte das gleiche Problem. Was geht hier vor sich?asp.net Optionsfeld Gruppierung

aspx

<asp:Repeater ID="repCustomers" runat="server"> 
    <HeaderTemplate> 
     <table class="tableDefault" cellpadding="0" cellspacing="0" border="0" style="width: 383px; border: 0px !important"> 
      <tr> 
       <th>&nbsp;</th> 
       <th>Cust. No.</th> 
       <th>Cust. Name</th> 
      </tr> 
    </HeaderTemplate> 
    <ItemTemplate> 
      <tr> 
       <td> 
        <asp:RadioButton ID="radCustomer" GroupName="Customer" runat="server" ValidationGroup="Customer" ToolTip='<%#Eval("CustomerNumber") %>' /> 
       </td> 
       <td><%#Eval("CustomerNumber")%></td> 
       <td><%#Eval("Name") %></td> 
      </tr> 
    </ItemTemplate> 
    <FooterTemplate> 
     </table> 
    </FooterTemplate> 
</asp:Repeater> 

Ausgang html

<table class="tableDefault" cellpadding="0" cellspacing="0" border="0" style="width: 383px; border: 0px !important"> 
    <tr> 
     <th>&nbsp;</th> 
     <th>Cust. No.</th> 
     <th>Cust. Name</th> 
    </tr> 

    <tr> 
     <td> 
      <span title="111111"><input id="ctl00_PrimaryContent_repCustomers_ctl01_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl01$Customer" value="radCustomer" /></span> 
     </td> 
     <td>111111</td> 
     <td>Jeremy's Test</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="222222"><input id="ctl00_PrimaryContent_repCustomers_ctl02_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl02$Customer" value="radCustomer" /></span> 
     </td> 
     <td>222222</td> 
     <td>My Test</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="333333"><input id="ctl00_PrimaryContent_repCustomers_ctl03_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl03$Customer" value="radCustomer" /></span> 
     </td> 
     <td>333333</td> 
     <td>Jim Bob's BBQ</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="444444"><input id="ctl00_PrimaryContent_repCustomers_ctl04_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl04$Customer" value="radCustomer" /></span> 
     </td> 
     <td>444444</td> 
     <td>New Hope Hamburgers</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="555555"><input id="ctl00_PrimaryContent_repCustomers_ctl05_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl05$Customer" value="radCustomer" /></span> 
     </td> 
     <td>555555</td> 
     <td>Pied Piper Pizza</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="666666"><input id="ctl00_PrimaryContent_repCustomers_ctl06_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl06$Customer" value="radCustomer" /></span> 
     </td> 
     <td>666666</td> 
     <td>Sandy's Subs</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="777777"><input id="ctl00_PrimaryContent_repCustomers_ctl07_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl07$Customer" value="radCustomer" /></span> 
     </td> 
     <td>777777</td> 
     <td>Leonard's Lambchops</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="888888"><input id="ctl00_PrimaryContent_repCustomers_ctl08_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl08$Customer" value="radCustomer" /></span> 
     </td> 
     <td>888888</td> 
     <td>Dave's Diamond Deli</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="999999"><input id="ctl00_PrimaryContent_repCustomers_ctl09_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl09$Customer" value="radCustomer" /></span> 
     </td> 
     <td>999999</td> 
     <td>Ernie's Eatery</td> 
    </tr> 

</table> 
+0

Welche Version von ASP.Net ist das? – CAbbott

+0

Die RadioButtons werden gruppiert, wenn ihre Felder 'Name' und nicht 'ID' identisch sind. –

+0

Trotz Ihres Kommentars über dieses Geschehen außerhalb eines Repeaters, denke ich, dass dieses spezielle Problem ziemlich eng mit Ihrer Verwendung des Repeaters verbunden ist, wie von CAbbott angemerkt. Sie sollten in Erwägung ziehen, den Titel Ihrer Frage entsprechend zu bearbeiten, wenn Sie feststellen, dass dies tatsächlich der Fall ist. – Beska

Antwort

46

um diese bekam ich endlich durch ein einfaches Radio-Button erstellen und den Wert Einstellen eines serverseitigen eval.

<input type="radio" name="radCustomer" value='<%#Eval("CustomerNumber") %>' /> 

Nun, wenn die Anwendung eine Postback ausführt, überprüfe ich für den Wert von Request.Form [ „radCustomer“]. Das funktioniert einwandfrei.

+1

Wenn wir die AutoPostback-Funktion benötigen? – Sam

+0

Ich konnte das nicht tun, weil ich

+0

Nicht gerade fehlerfrei - wenn das Formular nach dem Postback das Radio nicht bestanden hat Schaltflächen sind nicht ausgewählt - mit anderen Worten: Die Auswahl wird nicht zwischen den Postbacks gespeichert. –

0

ich durch Addieren eines Wertes auf meinem Radiobutton Wert beginnen würde = '<% # Eval ("Kundennummer")%>' .

+0

Es gibt kein Wertattribut für das Steuerelement der Optionsfeldsteuerung. – fizch

+0

Wahrscheinlich meinte er die Eigenschaft 'Text'. ;) –

+0

Das ist ein Nein. Ich wusste, dass es nur ein Etikett hinzufügen würde, aber ich dachte, dass ich es trotzdem versuchen würde. – fizch

19

Leider ist dies ein Brunnen known issue with radio buttons within a repeater. Eine Ihrer Optionen besteht darin, ein benutzerdefiniertes Serversteuerelement zu erstellen, das von der RadioButton-Klasse abgeleitet ist und die Darstellung überschreibt.

EDIT: Hier ist ein Beispiel, was die abgeleitete Klasse wie folgt aussehen kann:

public class MyRadioButton : RadioButton 
{ 
    protected override void Render(HtmlTextWriter writer) 
    { 
     writer.Write("<input id=\"" + base.ClientID + "\" "); 
     writer.Write("type=\"radio\" "); 
     writer.Write("name=\"" + base.ID + "\" "); 
     writer.Write("value=\"" + base.ID + "\" />"); 
     writer.Write("<label for=\"" + base.ClientID + "\">"); 
     writer.Write(base.Text); 
     writer.Write("</label>"); 
    } 
} 
+9

Wow. Dies ist ein ziemlich großes Loch in der Funktionalität. Bläh. – Beska

+1

Dies basiert auf der Idee, dass Sie eine Radiobutton-Gruppe innerhalb einer Item-Vorlage des Repeaters haben könnten (mehrere Radiobuttons in derselben Zeile). In diesem Fall würden Sie eine eindeutige Gruppierung basierend auf der Mangled-ID wünschen, aber die meiste Zeit möchten die Leute, was das OP versucht hat. – CAbbott

+2

Das '' -Tag schließt sich selbst und sollte kein End-Tag und keinen Text enthalten. Der Text sollte stattdessen in einem "

9

Ich reparierte es in Javascript

$(document).ready(function() { 
     $("#divWithGridViewOrRepeater input:radio").attr("name", "yourGroupName"); 
    }); 
+1

Was das "funktioniert" gibt es hier viel Verwirrungspotenzial. Wenn Sie wirklich mit dieser Methode gehen, stellen Sie sicher, dass Sie SCHWERPUNKT dokumentieren, was vor sich geht. –

3

ich die gleichen Probleme hatte. Ich verwende Literal als Platzhalter, um Radio Button onItemCreated-Ereignis zu rendern.

ASP.Net

<asp:Repeater ID="rpt" runat="server" OnItemCreated="rpt_OnItemCreated"> 
    <ItemTemplate> 
     <asp:Literal ID="lit" runat="server"></asp:Literal> 
    </ItemTemplate> 
</asp:Repeater> 

C#

protected void rpt_OnItemCreated(object sender, RepeaterItemEventArgs e) { 
    Literal lit = (Literal)e.Item.FindControl("lit"); 
    lit.Text = "<input type=\"radio\" name=\"myGroup\">"; 
} 
+0

Beachten Sie, dass Sie das Namensattribut (und nicht nur die ID) für die Radio-Schaltflächen angeben müssen, die in Request.Form beim Postback angezeigt werden! –

0

machte ich meinen Radiobutton haben Autopostback auf true gesetzt, und dann in der Ereignisbehandlungsroutine gesetzt, alle anderen Radio-Buttons nicht ausgewählten zu sein.

Nicht ideal, aber ich brauche viel Kontrolle über die Sichtbarkeit und aktivierten Attribute der Radiobutton, und es schien einfacher zu lassen ASP.NET Kontrolle, anstatt auf clientseitige Skript zurückgreifen.

2

ich leicht die oben r3dsky gepostet Antwort ändern musste.

Hier ist, was für mich gearbeitet:

$(document).ready(function() { 
     $(".divWithGridViewOrRepeater input:radio").attr("name", "yourGroupName"); 
    }); 
0

ich dies tat:

$("input:radio").attr("name", $("input:radio").first().attr("name")); 

Warum? Denn wenn Sie die name-Eigenschaft für eine beliebige Zeichenfolge ersetzen, erhalten Sie einen 'not found error'. Sie müssen also den Namen des ersten Radiobuttons abrufen und alle Namen mit diesem Namen umbenennen. Es funktioniert wie ein sharm;)

0

Meine Lösung, ähnlich wie andere:

<input id="ctlRadio" runat="server" type="radio" data-fixgroupbug="1" > 

// Fixes this ASP.NET bug: if radio input is inside repeater you can't set its name. 
// Every input gets set different name by ASP.NET. 
// They don't behave as a group. You can select multiple radios. 
function fixRadiogroupBug() 
{ 
    $('[type="radio"][data-fixgroupbug]').click(function() { 
     $(this).siblings('[type="radio"]').prop('checked', false); 
    }); 
} 

$(document).ready(function() { 
    fixRadiogroupBug(); 
});