2008-11-14 28 views
8

que tienen un control Repeater en ASPX páginas define así:¿Cómo encontrar el RadioButton marcado dentro del elemento repetidor?

<asp:Repeater ID="answerVariantRepeater" runat="server" 
    onitemdatabound="answerVariantRepeater_ItemDataBound"> 
    <ItemTemplate> 
     <asp:RadioButton ID="answerVariantRadioButton" runat="server" 
      GroupName="answerVariants" 
      Text='<%# DataBinder.Eval(Container.DataItem, "Text")%>'"/> 
    </ItemTemplate> 
</asp:Repeater> 

Para permitir que seleccione el botón de radio único en el tiempo que he utilizado una forma truco this article.

Pero ahora, cuando se envía el formulario, quiero determinar qué botón de opción está marcado.

que podía hacer esto:

RadioButton checkedButton = null; 

foreach (RepeaterItem item in answerVariantRepeater.Items) 
{ 
    RadioButton control=(RadioButton)item.FindControl("answerVariantRadioButton"); 
    if (control.Checked) 
    { 
     checkedButton = control; 
     break; 
    } 
} 

pero la esperanza que se podía hacer de alguna manera más simple (tal vez a través de LINQ a objetos).

Respuesta

2

Dado que ya está usando javascript para manejar el botón de clic del evento en el cliente, puede actualizar un campo oculto con el valor seleccionado al mismo tiempo.

El código del servidor simplemente accederá al valor seleccionado desde el campo oculto.

+0

O bien el original por lo lution en su pregunta o esto funcionará muy bien. – Kon

2

Estoy bastante seguro de que lo único que podría usar LINQ to Objects aquí sería tomar las condiciones dentro del ciclo foreach y moverlas a una cláusula where.

RadioButton checked = 
    (from item in answerVariantRepeater.Items 
    let radioButton = (RadioButton)item.FindControl("answerVariantRadioButton") 
    where radioButton.Checked 
    select radioButton).FirstOrDefault(); 
+0

Quizás es posible evitar el uso de ambos elementos y FindControl a favor de alguna colección de controles. –

+0

Nunca he visto una forma diferente de obtener una instancia de un control desde un control principal con plantillas. Lo más simple sería usar una RadioButtonList, pero supongo que su ejemplo se simplificó para mayor claridad y había otros controles en la plantilla que le impedían usar eso. –

6

Siempre se puede utilizar Request.Form para obtener el botón de radio presentado:

var value = Request.Form["answerVariants"]; 

Creo que los valores por defecto de valor presentadas a la identificación de la <asp:RadioButton /> que fue seleccionado, pero siempre se puede añadir un atributo de valor - Aunque oficialmente no es una propiedad <asp:RadioButton />, este será el valor presentado:

<asp:RadioButton ID="answerVariantRadioButton" runat="server" 
    GroupName="answerVariants" 
    Text='<%# DataBinder.Eval(Container.DataItem, "Text")%>'" 
    value='<%# DataBinder.Eval(Container.DataItem, "SomethingToUseAsTheValue")%>' /> 
Cuestiones relacionadas