【问题标题】:Asp.net: how to compare DataBinder.Eval with a member variable?Asp.net:如何将 DataBinder.Eval 与成员变量进行比较?
【发布时间】: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 %>

当我切换行(LinkBut​​ton 事件)时,第一个 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 事件发生在之前 LinkBut​​ton 事件更新 SelectedJobDefId 属性,该属性解释了默认值 1。

有没有办法切换事件的顺序?我可能只是采取了错误的方法。

【问题讨论】:

  • 您是说SelectedJobDefId 应该改变转发器每一行的值,但在使用&lt;%# %&gt; 操作时它不是这样做?
  • 顺便说一句,您可以保持您的 aspx 逻辑清晰,并在代码隐藏中的转发器的 ItemCreatedItemDataBound(取决于您的情况)中执行比较。
  • GuthMD:是的,如果与 一起使用,它的值会被固定为 1
  • Jeremy:问题是我想这样做来切换所选行的单元格的类或样式标记。正在想办法使用 ItemDataBound... 也许让表成为服务器标签?
  • 如果可以的话,我认为服务器控件会很棒。然后,在您的 ItemDataBound 中,您可以通过调用 myControl = e.Item.FindControl("MyControl") 然后执行类似 myControl.Attributes.Add("class", whateverclass) 之类的操作,通过 RepeaterItemEventArgs 访问该控件,尽管可能有更好的方法。但是,如果必须,您可以在代码后面添加一个方法,您可以在 aspx 中调用该方法,并在其中传入该行的 id: 并在代码隐藏中执行您的逻辑。

标签: asp.net


【解决方案1】:

只是将其作为一种选择,尽管显然不是最有效的方法。

SelectedJobDefId 更新后,您可以在LinkButton 点击处理程序中显式重新绑定Repeater。这样一来,您应该能够保留您原来拥有的所有 aspx 标记。

【讨论】:

    【解决方案2】:

    我可以通过在 LinkBut​​ton Click() 事件中使用 NamingContainer 属性来解决事件顺序问题,如下所示:

    RepeaterItem item = (RepeaterItem)((LinkButton)sender).NamingContainer;      
    HtmlTableCell td = (HtmlTableCell)item.FindControl("SelectTd");
    td.BgColor = "purple";
    

    为了完成这项工作,我创建了目标 td runat="server" 并将其命名为“SelectTd”。这有点令人不快,所以我可能只是在 jQuery 中通过隐藏字段来存储所选项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多