2009-08-26 20 views
28

Actualmente estoy teniendo un problema con los botones de opción y la agrupación. Tengo un botón de radio asp en un control de repetidor. Tengo el atributo del nombre del grupo establecido en "Cliente". Cuando se carga la página, los botones de opción no están agrupados. En lugar de que los campos de Id. Estén configurados para el nombre del grupo, está configurando los campos de valores de los botones de opción. Sé que he intentado configurar los botones de radio fuera del control de repetición y he tenido el mismo problema. ¿Que esta pasando aqui?agrupación de botones de opción asp.net

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> 

html de salida

<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

¿Qué versión de ASP.Net es esto? – CAbbott

+0

Los RadioButtons se agruparán si sus campos 'nombre', no 'ID', son idénticos. –

+0

A pesar de su comentario acerca de que esto ocurra fuera de un repetidor, creo que este tema en particular está estrechamente relacionado con su uso del repetidor, como lo señaló CAbbott. Es posible que desee considerar la edición del título de su pregunta para reflejar esto, si descubre que este es realmente el caso. – Beska

Respuesta

46

fin llegué alrededor de este mediante la creación de un botón de opción simple y estableciendo el valor utilizando un eval del lado del servidor.

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

Ahora, cuando la aplicación realiza una devolución de datos, puedo comprobar el valor de Request.Form [ "radCustomer"]. Esto funciona a la perfección.

+1

¿Si necesitamos la funcionalidad AutoPostback? – Sam

+0

No pude hacer esto porque necesitaba

+0

No exactamente perfecto - cuando el formulario no pasa algún tipo de validación luego después de la devolución no se seleccionan los botones; en otras palabras, la opción no se guarda entre las devoluciones. –

0

Me gustaría empezar por la adición de un valor en mi botón de radio Valor = '<% # Eval ("CUSTOMERNUMBER")%>' .

+0

No hay un atributo de valor para el control del botón de opción asp. – fizch

+0

Probablemente quiso decir la propiedad 'Texto'. ;) –

+0

Eso es un no ir. Sabía que solo iba a agregarle una etiqueta, pero pensé que lo probaría de todos modos. – fizch

19

Lamentablemente, este es un pozo known issue with radio buttons within a repeater. Una de sus únicas opciones sería crear un control de servidor personalizado derivado de la clase RadioButton y anular la forma en que representa.

EDITAR: He aquí una muestra de lo que la clase derivada puede verse como:

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. Este es un gran agujero en la funcionalidad. Bleh. – Beska

+1

Esto se basa en la idea de que podría tener un grupo de botones de radio dentro de una plantilla de elementos del repetidor (botones de opción múltiples en la misma fila). En ese caso, desearía una agrupación única basada en la identificación mutilada, pero la mayoría de las veces la gente quiere lo que el OP intentó hacer. – CAbbott

+2

La etiqueta '' se cierra automáticamente y no debe tener una etiqueta de cierre y texto dentro. El texto con él debería estar en una etiqueta '

9

me fijo en Javascript

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

Lo que esto "funciona" aquí tiene mucho potencial de confusión. Si realmente vas con este método, asegúrate de documentar HEAVILMENTE lo que está sucediendo. –

3

que tenía los mismos problemas. Estoy usando Literal como marcador de posición para renderizar el botón de opción onItemCreated.

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

Tenga en cuenta que debe especificar el atributo de nombre (y no únicamente el ID) para que los botones de radio aparezcan en Request.Form en la devolución de datos. –

0

que hizo que mi botón de radio han establecido AutoPostBack en verdad, y luego en el controlador de eventos establecer todos los otros botones de radio para ser seleccionada.

No es ideal, pero necesito mucho control sobre la visibilidad y los atributos habilitados del botón de radio, y parecía más fácil dejar que ASP.NET controlara eso en lugar de recurrir al script del lado del cliente.

2

tuve que modificar ligeramente la respuesta fue anunciado anteriormente por r3dsky.

Esto es lo que funcionó para mí:

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

Hice esto:

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

¿Por qué? porque si reemplaza la propiedad del nombre por cualquier cadena que desee, obtendrá un 'error no encontrado'. Por lo tanto, debe obtener el nombre del primer botón de radio y cambiar el nombre de todos ellos con ese nombre. Funciona como una Sharm;)

0

Mi solución, de forma similar a los demás:

<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(); 
}); 
Cuestiones relacionadas