Pergunta

Eu tenho um controle Repeater em ASPX páginas definidas como este:

<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 seleccionar apenas um botão de opção no tempo eu usei uma forma truque este artigo .

Mas agora o formulário for apresentado eu quero para determinar qual botão de opção está marcada.

Eu poderia fazer isso:

RadioButton checkedButton = null;

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

mas espero que isso poderia ser feito de alguma forma simplier (talvez via LINQ para objetos).

Foi útil?

Solução

Uma vez que você estiver usando javascript já para lidar com o evento de clique de botão de opção no cliente, você pode atualizar um campo escondido com o valor selecionado ao mesmo tempo.

O seu código do servidor, então, basta acessar o valor selecionado do campo oculto.

Outras dicas

Você pode sempre usar Request.Form para obter o botão de rádio apresentados:

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

Eu acho que os padrões valor enviado para o id do <asp:RadioButton /> que foi selecionado, mas você sempre pode adicionar um atributo de valor - mesmo que ele não é oficialmente uma propriedade <asp:RadioButton /> - e este será, então, o valor apresentado:

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

Eu tenho certeza que a única coisa que você poderia usar o LINQ to Objects para aqui seria a de tomar as condições de dentro do loop foreach e movê-los para uma cláusula onde.

RadioButton checked = 
    (from item in answerVariantRepeater.Items
    let radioButton = (RadioButton)item.FindControl("answerVariantRadioButton")
    where radioButton.Checked
    select radioButton).FirstOrDefault();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top