Search code examples
asp.netvb.netwebformsevalrepeater

If else logic in Repeater (aspx page)


I have a repeater on my website, and then I need to do the following code:

<% if(Eval("TypeID") = 5) then %>
    <%# Html.BtnDigital(Eval("ID").ToString(),Eval("Title").ToString())%>
<% end if %>

Basically: if a property on the databound item is 5, I need to do something special.

I cannot change the databound item, by adding a new property (unfortunately), and I am limited to VB.NET right now.

The button shows fine when I don't have the if statement, but when I have the if statement, I get the following error (sorry for Danish):

System.InvalidOperationException: Databindingmetoder som Eval(), XPath() og Bind() kan kun bruges i forbindelse med et databundet kontrolelement.
   ved System.Web.UI.Page.GetDataItem()
   ved System.Web.UI.TemplateControl.Eval(String expression)
   ved ASP.controls_guidesection_ascx.__Render__control19(HtmlTextWriter __w, Control parameterContainer) i C:\Users\larsholdgaard\Documents\Work\SAXO.com\Saxo.Websites.Base\src\Saxo.Website.Base\Controls\GuideSection.ascx:linje 75
   ved System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   ved System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
   ved System.Web.UI.Control.Render(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   ved System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
   ved System.Web.UI.Control.Render(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   ved System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
   ved System.Web.UI.Control.Render(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   ved System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
   ved System.Web.UI.Control.Render(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   ved System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
   ved System.Web.UI.Control.Render(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   ved System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
   ved System.Web.UI.Control.Render(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   ved System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
   ved System.Web.UI.Control.Render(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
   ved ASP.views_masterpages_saxomasterpage_master.__Render__control1(HtmlTextWriter __w, Control parameterContainer) i C:\Users\larsholdgaard\Documents\Work\SAXO.com\Saxo.Websites.Base\src\Saxo.Website.Base\Views\Masterpages\SaxoMasterPage.Master:linje 74
   ved System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   ved System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
   ved System.Web.UI.Control.Render(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
   ved System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
   ved System.Web.UI.Page.Render(HtmlTextWriter writer)
   ved System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
   ved System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
   ved System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Thanks :)


Solution

  • A good approach to solve such situations is to react to the ItemDataBound-event of the Repeater. It's much easier to check conditions in CodeBehind.

    For instance, if you want to change the visibility of a control in the ItemTemplate based upon a value of the item, you could add the following code (the following code is an example, among other things; I assume that there is a TextBox with the ID "txtValue" in the ItemTemplate):

    Private Sub Repeater_OnItemDatabound(Object sender, RepeaterItemEventArgs e)
        If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then
            Dim myItem = TryCast(e.Item.DataItem, MyDataItemClass)
            Dim txtBox = TryCast(e.Item.FindControl("txtValue"), TextBox)
            If (txtBox IsNot Nothing) Then
                txtBox.Visible = myItem.TypeId = 5
               txtBox.Text = myItem.SomeInterestingText
            End If
        End If
    End Sub