How to find checked RadioButton inside Repeater Item?
Asked Answered
R

3

9

I have a Repeater control on ASPX-page defined like this:

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

To allow select only one radio button in time I have used a trick form this article.

But now when form is submitted I want to determine which radio button is checked.

I could do this:

RadioButton checkedButton = null;

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

but hope it could be done somehow simplier (maybe via LINQ to objects).

Rosannarosanne answered 14/11, 2008 at 13:6 Comment(0)
U
2

Since You are using javascript already to handle the radio button click event on the client, you could update a hidden field with the selected value at the same time.

Your server code would then just access the selected value from the hidden field.

Unravel answered 14/11, 2008 at 14:40 Comment(1)
Either the original solution in your question or this will work nicely.Backrest
P
7

You could always use Request.Form to get the submitted radio button:

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

I think the submitted value defaults to the id of the <asp:RadioButton /> that was selected, but you can always add a value attribute - even though it's not officially an <asp:RadioButton /> property - and this will then be the submitted value:

<asp:RadioButton ID="answerVariantRadioButton" runat="server"
    GroupName="answerVariants" 
    Text='<%# DataBinder.Eval(Container.DataItem, "Text")%>'"
    value='<%# DataBinder.Eval(Container.DataItem, "SomethingToUseAsTheValue")%>' />
Parada answered 5/5, 2011 at 11:14 Comment(0)
U
2

Since You are using javascript already to handle the radio button click event on the client, you could update a hidden field with the selected value at the same time.

Your server code would then just access the selected value from the hidden field.

Unravel answered 14/11, 2008 at 14:40 Comment(1)
Either the original solution in your question or this will work nicely.Backrest
S
2

I'm pretty sure that the only thing you could use LINQ to Objects for here would be to take the conditions from within the foreach loop and move them to a where clause.

RadioButton checked = 
    (from item in answerVariantRepeater.Items
    let radioButton = (RadioButton)item.FindControl("answerVariantRadioButton")
    where radioButton.Checked
    select radioButton).FirstOrDefault();
Symposium answered 14/11, 2008 at 14:49 Comment(2)
Maybe it's possible to avoid using both Items and FindControl in favor of some Controls collection.Rosannarosanne
I've never seen a different way to get an instance of a control from a templated parent control. The simplest thing would be to use a RadioButtonList, but I assume that your example was simplified for clarity and there were other controls in the template that prevented you from using that.Symposium

© 2022 - 2024 — McMap. All rights reserved.