【发布时间】:2012-04-18 20:21:38
【问题描述】:
我正在尝试在中继器中执行此操作:
<%# Iif((int)DataBinder.Eval(Container.DataItem, "Id") == SelectedJobDefId, "blue", "red")%>
问题是成员属性仅在使用此语法时才计算:
<%= SelectedJobDefId %>
DataBinder.Eval() 仅在使用哈希符号时才有效。
作为测试,我尝试了这个:
<%= SelectedJobDefId %>
<%# DataBinder.Eval(Container.DataItem, "Id") + " " + SelectedJobDefId %>
当我切换行(LinkButton 事件)时,第一个 SelectedJobDefId 保持正确。 DataBinder 部分对于每一行都是正确的。 SelectedJobDefId 的第二个输出总是“1”。
如何比较这两个值?
更新:
根据 Jeremy 的建议,我将 td 设置为服务器标签,并尝试在 OnItemDataBound 中执行如下逻辑:
protected void Repeater2_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
RepeaterItem item = e.Item;
DataRowView drv = (DataRowView)item.DataItem;
int id = (int)drv.Row.ItemArray[0];
HtmlTableCell td = (HtmlTableCell)item.FindControl("failtd");
if (id == this.SelectedJobDefId){td.BgColor = "green";}
}
当我单步调试调试器时,OnItemDataBound 事件发生在之前 LinkButton 事件更新 SelectedJobDefId 属性,该属性解释了默认值 1。
有没有办法切换事件的顺序?我可能只是采取了错误的方法。
【问题讨论】:
-
您是说
SelectedJobDefId应该改变转发器每一行的值,但在使用<%# %>操作时它不是这样做? -
顺便说一句,您可以保持您的 aspx 逻辑清晰,并在代码隐藏中的转发器的
ItemCreated或ItemDataBound(取决于您的情况)中执行比较。 -
GuthMD:是的,如果与 一起使用,它的值会被固定为 1
-
Jeremy:问题是我想这样做来切换所选行的单元格的类或样式标记。正在想办法使用 ItemDataBound... 也许让表成为服务器标签?
-
如果可以的话,我认为服务器控件会很棒。然后,在您的 ItemDataBound 中,您可以通过调用 myControl = e.Item.FindControl("MyControl") 然后执行类似 myControl.Attributes.Add("class", whateverclass) 之类的操作,通过 RepeaterItemEventArgs 访问该控件,尽管可能有更好的方法。但是,如果必须,您可以在代码后面添加一个方法,您可以在 aspx 中调用该方法,并在其中传入该行的 id: 并在代码隐藏中执行您的逻辑。
标签: asp.net