现有的
代码正在使用
asp:repeater
创建HTML表。(强调现有设计)。这是生成表的部分伪代码:
<asp:repeater OnItemDataBound="ItemDataBound" ... >
<headertemplate>
<table>
<thead>
<tr>
<td>Date</td>
<td>Type</td>
<td>Action</td>
</tr>
</thread>
</headertemplate>
<itemtemplate>
<tr>
<td><%# GetTextForThis((MyItem)Container.DataItem) %></td>
<td><%# GetTextForThat((MyItem)Container.DataItem) %></td>
<td><%# GetTextForTheOther((MyItem)Container.DataItem) %></td>
</tr>
</itemtemplate>
<footertemplate>
</tbody>
</table>
</footertemplate>
</asp:repeater>
但现在需要(某些)项显示不同,并且需要使用
COLSPAN=3
,整个项目将是一个单元格:
<itemtemplate>
<tr>
<td colspan="3">
<img src="<%# GetImageSrcForFoo((MyItem)Container.DataItem) %>
<a href="<%# GetHrefForFoo((MyItem)Container.DataItem) %>
</td>
</tr>
</itemtemplate>
鉴于:
-
页面使用转发器构建HTML表
-
设计需要一些表行跨列
我该怎么做?
我是
希望
比如:
<itemtemplate id="thisThatTheOtherItemTemplate">
<tr>
<td><%# GetTextForThis((MyItem)Container.DataItem) %></td>
<td><%# GetTextForThat((MyItem)Container.DataItem) %></td>
<td><%# GetTextForTheOther((MyItem)Container.DataItem) %></td>
</tr>
</itemtemplate>
<itemtemplate id="fooItemTemplate">
<tr>
<td colspan="3">
<img src="<%# GetImageSrcForFoo((MyItem)Container.DataItem) %>
<a href="<%# GetHrefForFoo((MyItem)Container.DataItem) %>
</td>
</tr>
</itemtemplate>
并且神奇地能够让Ondatabind事件告诉中继器使用哪个模板。这有可能吗?
回答
虽然这两个答案都是正确的,但我宁愿使用第一个建议;它涉及在ASPX文件中显示代码,而不是在代码隐藏中手动构建HTML。(我不想再在代码中构建HTML)
<itemtemplate>
<asp:PlaceHolder ID="thing1" runat="server">
<tr>
<td><%# GetTextForThis((MyItem)Container.DataItem) %></td>
<td><%# GetTextForThat((MyItem)Container.DataItem) %></td>
<td><%# GetTextForTheOther((MyItem)Container.DataItem) %></td>
</tr>
</asp:PlaceHolder>
<asp:PlaceHolder ID="thing2" visible="false" runat="server">
<tr>
<td colspan="3">
<img src="<%# GetImageSrcForFoo((MyItem)Container.DataItem) %>
<a href="<%# GetHrefForFoo((MyItem)Container.DataItem) %>
</td>
</tr>
</itemtemplate>
在后面的代码中:
protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
// if the data bound item is an item or alternating item (not the header etc)
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
// get the associated object
Object item = .Item.DataItem;
if (item == null)
return;
Control thing1 = e.Item.FindControl("thing1");
Control thing2 = e.Item.FindControl("thing2");
if (item is MyClassThatICreated)
{
thing1.Visible = false;
thing2.Visible = true;
}
else
{
thing1.Visible = true;
thing2.Visible = false;
}
...
}