Je voudrais pouvoir utiliser le contrôle ASP.Net Repeater pour créer un tableau HTML qui a trois colonnes et autant de lignes que necc.
Par exemple, si les données devaient ressembler à ceci
"Phil Hughes"
"Andy Petite"
"CC Sabathia"
"AJ Burnett"
"Javier Vazquez"
J'aimerais que le tableau résultant soit comme
<table>
<tr>
<td>Phil Hughes</td>
<td>Andy Petite</td>
<td>CC Sabathia</td>
</tr>
<tr>
<td>AJ Burnett</td>
<td>Javier Vazquez</td>
<td></td>
</tr>
</table>
Comment puis-je faire ceci?
Il est préférable d'utiliser un contrôle DataList à l'intérieur car il a les propriétés intéressantes RepeatColumns et RepeatDirection .
Le répéteur n'est pas le contrôle idéal pour le faire. Si vous utilisez .NET 3.5, vous devez utiliser ListView à la place. Voici un exemple qui fait ce que vous demandez.
<asp:ListView ID="myListView" runat="server"
DataSourceID="YOURDATASOURCE" GroupItemCount="3">
<LayoutTemplate>
<table>
<tr>
<td>
<table border="0" cellpadding="5">
<asp:PlaceHolder runat="server" ID="groupPlaceHolder"></asp:PlaceHolder>
</table>
</td>
</tr>
</table>
</LayoutTemplate>
<GroupTemplate>
<tr>
<asp:PlaceHolder runat="server" ID="itemPlaceHolder"></asp:PlaceHolder>
</tr>
</GroupTemplate>
<ItemTemplate>
<td>
<%# Eval("FullName") %>
</td>
</ItemTemplate>
</asp:ListView>
Beaucoup plus simple que tous les exemples répertoriés ici; Vous n'avez pas besoin d'utiliser une vue de liste ou de faire quoi que ce soit dans le code derrière.
<asp:Repeater ID="ExampleRepeater" runat="server" >
<HeaderTemplate>
<table>
<tr>
<th> Column 1
</th>
<th> Column 2
</th>
<th> Column 3
</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:LinkButton ID="RemoveButton" runat="server" Text='Remove' CommandName="Remove"
CommandArgument='<%# Eval("ID") %>' CausesValidation="false"></asp:LinkButton>
</td>
<td>
<asp:LinkButton ID="EditLink" runat="server" Text='<%# Eval("Name") %>'
CommandName="Edit" CommandArgument='<%# Eval("ID") %>' CausesValidation="false"></asp:LinkButton>
</td>
<td>
<asp:Label ID="CommentTextBox" runat="server" Text='<%# Eval("Comment") %>' />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
<asp:Repeater runat="server" DataSourceID="testds">
<HeaderTemplate>
<table class="items">
</HeaderTemplate>
<ItemTemplate>
<%# (Container.ItemIndex + 3) % 3 == 0 ? "<tr>" : string.Empty%>
<td><img src='/blablabla/<%# Eval("id") %>.jpg' alt="" /></td>
<%# (Container.ItemIndex + 3) % 3 == 2 ? "</tr>" : string.Empty%>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
Je suppose que vous avez tous ces noms dans 5 lignes de données et que vous souhaitez le répartir sur 3 colonnes dans un répéteur et ne pas avoir 2 lignes de données avec 3 champs qui seraient simples. Selon mon hypothèse, vos données sont quelque chose comme:
DataTable
(ou quelle que soit votre source):
ID Name
---------------
1 Bob
2 John
3 Joe
4 Mary
5 Mike
Vous pouvez le faire en utilisant un Repeater
et un Literal
avec un peu de logique sur l'événement OnDataBinding
de Literal
.
Définissez d'abord votre Repeater
:
<asp:Repeater ID="repeater" runat="server">
<HeaderTemplate>
<table>
</HeaderTemplate>
<ItemTemplate>
<asp:Literal ID="litItem" runat="server" OnDataBinding="litItem_DataBinding" />
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
Ensuite, vous aurez besoin d'une constante pour le nombre total de colonnes que vous souhaitez et de deux variables globales pour suivre l'opération de liaison. Définissez-les ainsi:
public partial class _YourPage : System.Web.UI.Page
{
private const int _repeaterTotalColumns = 3;
private int _repeaterCount = 0;
private int _repeaterTotalBoundItems = 0;
Ensuite, vous devrez implémenter OnDataBinding pour effectuer tout le travail personnalisé:
protected void litItem_DataBinding(object sender, System.EventArgs e)
{
Literal lt = (Literal)(sender);
_repeaterCount++;
if (_repeaterCount % _repeaterTotalColumns == 1)
{
lt.Text = "<tr>";
}
lt.Text += string.Format("<td>{0}</td>", Eval("Name").ToString());
if (_repeaterCount == _repeaterTotalBoundItems)
{
// Last item so put in the extra <td> if required
for (int i = 0;
i < (_repeaterTotalColumns - (_repeaterCount % _repeaterTotalColumns));
i++)
{
lt.Text += "<td></td>";
}
lt.Text += "</tr>";
}
if (_repeaterCount % _repeaterTotalColumns == 0)
{
lt.Text += "</tr>";
}
}
Assurez-vous ensuite que lorsque vous liez votre Repeater
, vous enregistrez le nombre total:
_repeaterTotalBoundItems = yourDataTable.Rows.Count;
repeater.DataSource = yourDataTable;
repeater.DataBind();
La production produite serait:
<table>
<tr><td>Bob</td>
<td>John</td>
<td>Joe</td></tr>
<tr><td>Mary</td>
<td>Mike</td><td></td></tr>
</table>
Vous pourriez probablement améliorer le code DataBinding
mais je viens de le claquer pour donner la prémisse de base de la façon d'atteindre votre objectif. Si le DataBinding
a besoin de faire beaucoup d'opérations de concaténation de chaîne, vous devriez probablement passer à l'utilisation d'un StringBuilder
et ensuite simplement affecter le Literal
lors de la dernière opération.
Ou utilisez simplement un div dans le répéteur, puis résolvez les problèmes de hauteur/largeur avec CSS.