我假設你有5行數據中的所有這些名稱,並且你希望將它分佈在中繼器中的3列中,而不是具有3行的數據的2行,這將是直截了當的。根據我假設你的數據是這樣的:
DataTable
(或任何你的源):
ID Name
---------------
1 Bob
2 John
3 Joe
4 Mary
5 Mike
您可以用做一個Repeater
,並在OnDataBinding
事件的一個小邏輯Literal
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做所有的定製工作:當你綁定你Repeater
要保存的總數
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>";
}
}
然後確保:
_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
需要執行大量字符串concat操作,則可能應該切換到使用StringBuilder
,然後在最後一個操作中只分配Literal
。
我想同樣的事情,但我認爲一個'Repeater'被要求或擴展現有的代碼。如果不是這是一個很好的閱讀「什麼時候給我們一個DataGrid,DataList或Repeater」http://msdn.microsoft.com/en-us/library/aa479015.aspx。有點舊(我們現在有'ListView'和'GridView'),但這些概念仍然適用。 – Kelsey 2010-08-09 19:05:41
DataList有蹩腳的造型! – 2014-04-09 19:14:05
@ user148298它會生成你希望它發出的html,所以我不太瞭解你的評論。一如既往:垃圾,垃圾:-)。 – XIII 2014-04-11 12:42:34