DataPager)、排序、編輯、插入、刪除LayoutTemplate 定義容器,ItemTemplate 定義行<asp:ListView ID="lvMovies" runat="server" DataSourceID="dsMovies">
<LayoutTemplate>
<table class="movie-grid">
<thead>
<tr><th>ID</th><th>標題</th><th>上映日期</th></tr>
</thead>
<tbody>
<asp:PlaceHolder ID="itemPlaceholder" runat="server" />
</tbody>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("movie_id") %></td>
<td><%# Eval("title") %></td>
<td><%# Eval("release_date", "{0:d}") %></td>
</tr>
</ItemTemplate>
</asp:ListView>

<asp:ListView ID="lvMenu" runat="server" DataSourceID="dsMenu">
<LayoutTemplate>
<ul class="nav">
<asp:PlaceHolder ID="itemPlaceholder" runat="server" />
</ul>
</LayoutTemplate>
<ItemTemplate>
<li>
<a href="<%# Eval('Url') %>"><%# Eval('Name') %></a>
<!-- 子菜單遞歸嵌套 -->
<asp:ListView ID="lvSubMenu" runat="server"
DataSource='<%# ((MenuItem)Container.DataItem).Children %>'>
<LayoutTemplate><ul><asp:PlaceHolder ID="itemPlaceholder" runat="server" /></ul></LayoutTemplate>
<ItemTemplate><li><a href="<%# Eval('Url') %>"><%# Eval('Name') %></a></li></ItemTemplate>
</asp:ListView>
</li>
</ItemTemplate>
</asp:ListView>
public class MultiTemplateListView : ListView {
protected override void InstantiateItem(TemplateContainer container) {
var item = (DataItem)container.DataItem;
string templateName = item.Type switch {
"Header" => "HeaderTemplate",
"Footer" => "FooterTemplate",
"Ad" => "AdTemplate",
_ => "ItemTemplate"
};
var template = (ITemplate)this.GetType().GetProperty(templateName).GetValue(this);
template.InstantiateIn(container);
}
}
實現:根據數據項類型動態選擇模板,超越 ItemDataBound 樣式切換的局限。