重复器中的If语句

本文关键字:If 语句 | 更新日期: 2023-09-27 18:19:03

我正在使用ASP。. NET Repeater显示<table>的内容。它看起来像这样:

<table cellpadding="0" cellspacing="0">
    <asp:Repeater ID="checkboxList" runat="server" OnItemDataBound="OnCheckboxListItemBound">
        <ItemTemplate>
            <tr id="itemRow" runat="server">
                <td>
                    Some data
                </td>
            </tr>
        </ItemTemplate>
    </asp:Repeater>
</table>

它工作得很好,但我想在ItemTemplate内有一个if()语句,所以我可以有条件地确定我是否要打印出<tr>标签。

所以我想有这样的东西:

<table cellpadding="0" cellspacing="0">
    <asp:Repeater ID="checkboxList" runat="server" OnItemDataBound="OnCheckboxListItemBound">
        <ItemTemplate>
            <% if ( (CurrentItemCount % 2) == 0 ) { %?>
            <tr id="itemRow" runat="server">
            <% } %>
                <td>
                    Some data
                </td>
            <% if ( (CurrentItemCount % 2) == 0 ) { %?>
            </tr>
            <% } %>
        </ItemTemplate>
    </asp:Repeater>
</table>

有什么方法可以做到这一点吗?

p。CurrentItemCount只是合成的。我还需要一种方法来获得if()语句内的当前项目计数。但我似乎只能从<%# Container.ItemIndex; %>中得到它,这不能与if()语句一起使用?

重复器中的If语句

另一种方法(如果性能不是问题):

<ItemTemplate>
  <!-- "If"  -->
  <asp:PlaceHolder runat="server" Visible="<%# MyCondition %>">
    <tr><td></td></tr>
  </asp:PlaceHolder>  
  <!-- "Else" -->
  <asp:PlaceHolder runat="server" Visible="<%# !MyCondition %>">
    <tr><td></td></tr>
  </asp:PlaceHolder>
</ItemTemplate>

如果你想创建一个两列的表这就可以了

<%# Container.ItemIndex % 2 == 0 ? "<tr class='itemRow'>" : "" %>
    <td>
       Some data
    </td>
<%# Container.ItemIndex % 2 != 0 ? "</tr> : "" %>

更改了几件事:id="itemRow"对所有行的将导致重复的id,这是不允许的。

删除runat="server",因为在这个上下文中没有意义。

我有两个例子,对于这些例子,我将把中继器绑定到一个字符串数组(仅用于演示目的)

void BindCheckboxList()
{
 checkboxList.DataSource = new string[] { "RowA", "RowB", "RowC", "RowD", "RowE", "RowF", "RowG" };
 checkboxList.DataBind();
}

示例1:在代码中创建一个方法,将绑定的元素强制转换回您想要的值。

在CodeBehind中创建方法(示例1):

protected string StringDataEndsWith(object dataElement, string endsWith, string  returnValue)
{
// for now an object of the type string, can be anything.
string elem = dataElement as string;
    if (elem.EndsWith(endsWith))
    {
     return returnValue; 
    }
     else
    {
     return ""; 
    }
}

在.aspx文件中(例1):

<asp:Repeater ID="checkboxList" runat="server">
<HeaderTemplate> 
    <table style="padding:0px;margin:0px;">
</HeaderTemplate> 
<ItemTemplate>
    <%# StringDataEndsWith(Container.DataItem,"A","<tr id='"itemRow'" runat='"server'">")  %>
    <td>
        <%# Container.DataItem  %>
    </td>
    <%# StringDataEndsWith(Container.DataItem,"G","</tr>")  %>
</ItemTemplate>
<FooterTemplate>
    </table>
</FooterTemplate>
</asp:Repeater>
示例2:您可以在.aspx文件 中使用直接强制转换

DirectCast示例(后面没有代码):

<asp:Repeater ID="checkboxList" runat="server">
<HeaderTemplate> 
    <table style="padding:0px;margin:0px;">
</HeaderTemplate> 
<ItemTemplate>
    <%# Convert.ToString(Container.DataItem).EndsWith("A") ? "<tr id='"itemRow'" runat='"server'">" : ""  %>
    <td>
        <%# Container.DataItem  %>
    </td>
    <%# Convert.ToString(Container.DataItem).EndsWith("G") ? "</tr>" : ""  %>
</ItemTemplate>
<FooterTemplate>
    </table>
</FooterTemplate>
</asp:Repeater>

我希望这就是你要找的。问候。

如果你想在每一个项目上做一些事情,使用交替项目模板。http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.alternatingitemtemplate.aspx

我会使用codebehind:

protected void OnCheckboxListItemBound(Object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        HtmlTableRow itemRow = (HtmlTableRow) e.Item.FindControl("itemRow");
        itemRow.Visible = e.Item.ItemIndex % 2 == 0;
    }
}