Frage

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

War es hilfreich?

Lösung

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

Andere Tipps

What you need to do is check the value in an ItemDataBound Event. These will fire as each Item is bound. In this even do your check and if you have a match do your change.

See http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound(v=vs.110).aspx

The example in the msdn page also shows how to distinguish header and footer rows as well as alternate row templates if you use them. The even is fired as each row is created.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top