ASP.NET RadioButtonList in Repeater?

AliRıza Adıyahşi picture AliRıza Adıyahşi · Jun 18, 2012 · Viewed 8.8k times · Source

aspx file:

<asp:Repeater ID="Repeater_sorular" runat="server">
   <HeaderTemplate>
   </HeaderTemplate>
   <ItemTemplate>
      <div class="div_soru">
         <div class="div_soru_wrapper">
             <%#Eval("Subject")%>
             <asp:RadioButtonList ID="RadioButtonList_secenekler" runat="server" Visible='<%# Eval("TypeId").ToString() == "1" %>'
                DataSource='<%#Eval("Secenekler")%>' DataTextField='<%#Eval("OptionName")%>' DataValueField='<%#Eval("OptionId")%>'>
             </asp:RadioButtonList>
             <asp:CheckBoxList ID="CheckBoxList_secenekler" runat="server" Visible='<%# Eval("TypeId").ToString() == "2" %>'
                DataSource='<%#Eval("Secenekler")%>' DataTextField='<%#Eval("OptionName")%>' DataValueField='<%#Eval("OptionId")%>'>
             </asp:CheckBoxList>
         </div>
      </div>
   </ItemTemplate>
   <FooterTemplate>
   </FooterTemplate>
</asp:Repeater>

and codebehind:

SpAnketDataContext db = new SpAnketDataContext();

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindRepeaterSorular();
    }
}

protected void ImageButton_kaydet_OnCommand(object source, CommandEventArgs e)
{

}

private void BindRepeaterSorular()
{
    int anket_id = 3;

    var sorular = from soru in db.TableSurveyQuestions
                  where soru.SurveyId == anket_id
                  select new
                  {
                      soru.TypeId,
                      soru.Subject,
                      soru.QuestionId,
                      soru.SurveyId,
                      soru.QueueNo,
                      SurveyTitle = soru.TableSurvey.Title,
                      TypeName = soru.TableSurveyQuestionType.TypeName,

                      Secenekler = from secenekler in soru.TableSurveyOptions
                                   select new
                                   {
                                       secenekler.OptionId,
                                       secenekler.OptionName,
                                       secenekler.QuestionId,
                                   }
                  };

    Repeater_sorular.DataSource = sorular;
    Repeater_sorular.DataBind();
}

And my question:

I cant bound datavaluefield and datatextfiled. If I write as defined above. I got this errror.

DataBinding: '<>f__AnonymousType1`8[[System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Collections.Generic.IEnumerable`1[[<>f__AnonymousT...' does not contain a property with the name 'OptionName'.

How can I bind value and text.

Thanks.

Answer

Jupaol picture Jupaol · Jun 18, 2012

The error explains itself clearly:

does not contain a property with the name 'OptionName'

Just change this (in both, your declaration of RadioButtonList and CheckBoxList):

DataTextField='<%#Eval("OptionName")%>' DataValueField='<%#Eval("OptionId")%>'

To:

DataTextField="OptionName" DataValueField="OptionId"

And that's it, you do not need to evaluate the binding, just specify the name of the property. The rest of your code looks good

Edited

As Requested, to get the selected item from the RadioButtonList:

<asp:GridView runat="server" OnRowCommand="grdProducts_RowCommand" ID="grdProducts">
    <Columns>
        <asp:TemplateField ShowHeader="False">
            <ItemTemplate>
                <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="false" 
                    CommandName="myLink" CommandArgument='<%# DataBinder.Eval(Container, "RowIndex") %>' Text="Button"></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:RadioButtonList DataTextField="NestedValue" DataValueField="ID" runat="server" DataSource='<%# Eval("Nested") %>' ID="radios">
                </asp:RadioButtonList>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

<asp:Label runat="server" ID="lblMessage" />

Code behind:

    protected void grdProducts_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        switch (e.CommandName)
        {
            case "myLink":
                var row = this.grdProducts.Rows[int.Parse(e.CommandArgument.ToString())];
                var radios = row.FindControl("radios") as RadioButtonList;
                this.lblMessage.Text += "<br/>" + radios.UniqueID;
                this.lblMessage.Text += "<br/> dedede " + radios.SelectedValue;
                break;
        }
    }