web-dev-qa-db-fra.com

Si instruction dans les répéteurs ItemTemplate

J'utilise une variable ASP.NET Repeater pour afficher le contenu d'un <table>. Cela ressemble à quelque chose comme ça:

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

Cela fonctionne bien, mais j'aimerais avoir une déclaration if() dans la variable ItemTemplate afin que je puisse déterminer de manière conditionnelle si je souhaite imprimer une balise <tr>.

Donc j'aimerais avoir quelque chose comme ça:

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

Y at-il un moyen que je peux atteindre cela?

PS La CurrentItemCount est juste inventée. J'ai également besoin d'un moyen d'obtenir le nombre d'éléments actuel dans cette instruction if(). Mais il semble que je ne puisse l'obtenir que de <%# Container.ItemIndex; %>, qui ne peut pas être utilisé avec une instruction if()?

10
Vivendi

Je voudrais utiliser 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;
    }
}
0
Rango

Une autre façon de faire (si la performance n’est pas un problème):

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

Si vous essayez de faire un tableau de 2 colonnes cela pourrait faire l'affaire

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

Quelques modifications ont été apportées: id="itemRow" pour toutes les lignes provoquerait des identifiants répétés, ce qui n'est pas autorisé.

runat="server" supprimé depuis n'a pas de sens dans ce contexte.

16
Claudio Redi

J'ai 2 exemples, pour les exemples je vais lier le répéteur à un tableau de chaînes (à des fins de démonstration uniquement)

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

Exemple 1: Créez une méthode in de codebehind en retournant les éléments liés et évaluez la valeur désirée.

Créer une méthode dans CodeBehind (exemple 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 ""; 
    }
}

Dans le fichier .aspx (exemple 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>

Exemple 2: vous pouvez utiliser une conversion directe dans le fichier .aspx

Exemple DirectCast (pas de code derrière):

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

J'espère que c'est ce que vous cherchez. Cordialement.

Si vous souhaitez utiliser quelque chose sur chaque autre élément, utilisez le modèle d'élément alterné. http://msdn.Microsoft.com/en-us/library/system.web.ui.webcontrols. repeater.alternatingitemtemplate.aspx

0
kduenke