2010-10-27 9 views
6

Tengo un control de repetidor en mi página. Necesito tener un botón de radio en todas las filas (Plantilla de artículo) al marcar un botón de radio, los botones de radio restantes deben desmarcarse.lista de botones de radio en control de repetidor

¿Cómo hacer esto?

Gracias de antemano, Tor

Respuesta

1

Sólo añadir un evento OnCheckedChanged al botón de opción, bucle todos los botones de radio en el repetidor para anular su selección. Puede usar UpatePanel si no desea la devolución de datos.

.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

Para el ejemplo anterior, si se agrega la propiedad "Nombre de grupo" para el control , Se agregará todo el radioButton en el mismo grupo, por lo que solo se seleccionará un botón de opción. – Shivkant

+0

oh sí ... deberíamos usar eso en su lugar! – bla

+0

Un UpdatePanel todavía causará una devolución de datos, solo que será una devolución de datos de Ajax. Todavía tomará tiempo ya que debe enrutar hacia/desde el servidor. – nealkernohan

10

Por desgracia, es un error conocido (http://support.microsoft.com/kb/316495) que la propiedad GroupName no funciona como se esperaba cuando se utiliza en un repetidor . El problema es que el repetidor implementa la interfaz INamingContainer que requiere que todos los controles anidados tengan un nombre único cuando se procesan en HTML. Esto hace que los botones de opción se rompan porque para que funcionen correctamente deben tener nombres idénticos.

Hay 2 soluciones temporales que yo he encontrado:

1 - La primera es una del lado del cliente JavaScript solución. Fue proporcionado por Microsoft support. O una versión más fácil de leer here. Las instrucciones son las siguientes. Incluir la siguiente JavaScript en la CABEZA:

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; 
} 

Ahora la función tiene que estar relacionado con los botones de opción en caso OnDataItemBound del repetidor. Reemplazar "RadioButton" con el nombre de su control RadioButton y "RadioGroup" con el Nombre de grupo que ha elegido:

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 segunda solución es una solución de servidor utilizando un control de usuario personalizado que hereda de RadioButton. El tutorial y el código fuente se pueden descargar aquí: http://www.codeproject.com/KB/webforms/How_group_RButtons.aspx

0

Sé que esto es antiguo, pero la razón de que los botones no funcionen es porque se está sobrescribiendo el atributo del nombre. Si usa jQuery, puede asignar el botón de opción a una clase y luego establecer el atributo de nombre para anular el nuevo nombre.

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

Otra alternativa más simple, donde no se requiere formato de lujo, es utilizar un RadioButtonList:

<asp:RadioButtonList ... />