web-dev-qa-db-ja.com

リピーター内のifステートメントItemTemplate

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>
_

これを達成する方法はありますか?

PS。 CurrentItemCountが作成されました。そのif()ステートメント内の現在のアイテム数を取得する方法も必要です。しかし、if()ステートメントで使用できない_<%# Container.ItemIndex; %>_からしか取得できないようです。

10
Vivendi

私は分離コードを使用します:

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;
    }
}
0
Tim Schmelter

これを実行する別の方法(パフォーマンスに問題がない場合):

<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>
18
maets

あなたが2列のテーブルを作ろうとしているなら、これはトリックをすることができます

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

いくつかの変更:id="itemRow"すべての行で、許可されていないIDが繰り返されます。

削除済みrunat="server"このコンテキストでは意味がないため。

16
Claudio Redi

私には2つの例があります。例では、リピーターを文字列の配列にバインドします(デモ目的のみ)

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

0
kduenke