Я предполагаю, что у вас есть все эти имена в 5 строках данных, и вы хотите распределить их по 3 столбцам в повторителе и не иметь 2 строк данных с 3 полями, которые были бы прямыми. Исходя из моего предположения, ваши данные выглядят примерно так:
DataTable
(или каков ваш источник):
ID Name
---------------
1 Bob
2 John
3 Joe
4 Mary
5 Mike
Вы можете сделать это, используя Repeater
и Literal
с небольшой логикой для события OnDataBinding
Literal
.
Сначала определите ваш 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>
Далее вам понадобится константа для всех столбцов, которые вы хотите, и две глобальные переменные для отслеживания операции привязки. Определите их так:
public partial class _YourPage : System.Web.UI.Page
{
private const int _repeaterTotalColumns = 3;
private int _repeaterCount = 0;
private int _repeaterTotalBoundItems = 0;
Затем вам нужно будет реализовать OnDataBinding, чтобы выполнить всю пользовательскую работу:
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>";
}
}
Затем убедитесь, что, когда вы связываете Repeater
, вы сохраняете общее количество:
_repeaterTotalBoundItems = yourDataTable.Rows.Count;
repeater.DataSource = yourDataTable;
repeater.DataBind();
Результат будет:
<table>
<tr><td>Bob</td>
<td>John</td>
<td>Joe</td></tr>
<tr><td>Mary</td>
<td>Mike</td><td></td></tr>
</table>
Вы, возможно, могли бы улучшить код DataBinding
, но я просто испортил его, чтобы дать основную предпосылку того, как достичь вашей цели. Если DataBinding
нужно выполнить много операций с конкатами строк, вам, вероятно, следует переключиться на использование StringBuilder
, а затем просто присвоить Literal
в последней операции.