在ListView中使用Eval()或DataBinder.Eval()的If语句?

4

我在一个 .aspx 页面上有一个列表视图控件。我想在这个列表视图中检查来自数据库的 “Type” 属性。以下是示例代码:

 <ItemTemplate>
         <%# if(Convert.ToInt32(DataBinder.Eval(Container.DataItem,"Type")) == 0){ %>
            <tr class="item">
                <td>
                    <%# Convert.ToDateTime(Eval("WorkDate")).ToShortDateString() %>
                </td>
                <td style="text-align: center;">
                    <%# Eval("SkillName") %>
                </td>
             </tr>
         <%# } else if (Convert.ToInt32(DataBinder.Eval(Container.DataItem,"Type")) == 1) {%>
             <tr class="item">
                <td colspan="2">
                    <strong><%# Convert.ToDateTime(Eval("WorkDate")).ToShortDateString() %></strong>
                </td>
             </tr>
          <% } %>
  </ItemTemplate>

作为最后一种尝试,我尝试使用DataBinder.Eval(),但是我遇到了异常"Expected class, delegate, enum, interface, or struct"。我可能做错了什么?对我来说,在代码后端编写一个函数不是一个选择。有没有办法实现这个功能?

在代码后台编写函数对我来说不是一个选项。为什么?因为有一个ItemDataBound事件,您可以轻松地完成所有操作:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listview.itemdatabound.aspx - Tim Schmelter
问题出在控制语句上,它们在项模板中是不允许的。 - Hogan
3个回答

4
这是完整的代码,经过简化和美化。
 <ItemTemplate>
         <tr class="item">
            <td colspan="<%# Eval(Container.DataItem,"Type")) == 0 ? 1:2%>">
                <strong><%# Convert.ToDateTime(Eval("WorkDate")).ToShortDateString() %></strong>
            </td>
             <td style="text-align: center;" visible="<%# Eval(Container.DataItem,"Type")) == 1>">
                <%# Eval("SkillName") %>
            </td>
        </tr>
 </ItemTemplate>

这个 Eval 东西会在服务器端执行,对吗? - haku
1
@HakuKalay - 在.NET中,<% %><%# %>中的内容由脚本系统评估,而不是直接发送到浏览器。当存在#时,它意味着写入评估表达式的结果。当不存在#时,它将由脚本语言执行(因此可以包含分支和循环功能)。 - Hogan

2

未经测试,因为我此刻没有可用的Visual Studio,但由于HtmlTableRow具有Visible属性,以下内容应该有效:

<tr class="item" runat="server" Visible='<%# Convert.ToInt32(Eval("Type")) == 0 %>'>
    ...
</tr>

0

是的,您需要进行一些客户端脚本编写...我建议使用 JQuery。

基本上,您将在 JQuery 中循环遍历所有行,并根据行中的数据,基于“.item”选择器更改该行对象的innerhtml,以确定它应该是哪种格式。


1
不需要客户端脚本 -- 可以参考 @Heinzi 的标准方法来实现这一点。 - Hogan
我理解 OP 的问题是他有两种不同的格式,每行都需要实现。如果是一种类型,则应该采用一种方式进行格式化,如果是另一种类型,则应该采用另一种方式。我不确定基于类型隐藏行是否有效,除非在模板中对数据集中的每个记录进行双重显示,并在每次迭代中打开和关闭它们。 - Patrick
Heinzi的方法完全正确。这不需要客户端脚本。 - ward87
是的,那正是你所要做的,或者你可以像我的例子一样变得花哨和具体。 - Hogan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接