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()
?
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;
}
}
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>
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.
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