DataList 是功能豐富的資料繫結控制項,預設以 <table> 結構渲染重複項目,支援多種樣式屬性、交替項目模板、編輯/刪除/選取命令事件,適合呈現製品目錄、相簿等網格式資料。
<asp:DataList ID="dlProducts" runat="server">
<HeaderTemplate> <!-- 渲染一次,最上方 --> </HeaderTemplate>
<ItemTemplate> <!-- 每筆資料重複渲染 --> </ItemTemplate>
<AlternatingItemTemplate> <!-- 交替項目(偶數行) --> </AlternatingItemTemplate>
<SelectedItemTemplate> <!-- 選取項目樣式 --> </SelectedItemTemplate>
<EditItemTemplate> <!-- 編輯模式樣式 --> </EditItemTemplate>
<SeparatorTemplate> <!-- 項目間分隔符 --> </SeparatorTemplate>
<FooterTemplate> <!-- 渲染一次,最下方 --> </FooterTemplate>
</asp:DataList>
<?xml version="1.0" encoding="utf-8"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</cd>
<!-- 更多資料... -->
</catalog>
<%@ Import Namespace="System.Data" %>
<script runat="server">
void Page_Load() {
if (!IsPostBack) {
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("~/App_Data/cdcatalog.xml"));
dlCatalog.DataSource = ds;
dlCatalog.DataBind();
}
}
</script>
<asp:DataList ID="dlCatalog" runat="server"
GridLines="Both"
CellPadding="3"
CellSpacing="0">
<HeaderTemplate>
<tr style="background:#336699; color:white; font-weight:bold;">
<td colspan="3">我的 CD 目錄</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("title") %></td>
<td><%# Eval("artist") %></td>
<td>$<%# Eval("price") %></td>
</tr>
</ItemTemplate>
<FooterTemplate>
<tr><td colspan="3" align="center">Copyright © 2024</td></tr>
</FooterTemplate>
</asp:DataList>
DataList 提供豐富的樣式屬性,可直接在標籤設定:
<asp:DataList ID="dlCatalog" runat="server"
BackColor="#e8e8e8"
BorderStyle="Inset"
BorderWidth="1px"
CellPadding="4"
CellSpacing="2"
Width="100%"
GridLines="Both"
HeaderStyle-Font-Name="Verdana"
HeaderStyle-Font-Size="14pt"
HeaderStyle-Font-Bold="true"
HeaderStyle-BackColor="#336699"
HeaderStyle-ForeColor="White"
HeaderStyle-HorizontalAlign="Center"
ItemStyle-BackColor="#778899"
ItemStyle-ForeColor="White"
AlternatingItemStyle-BackColor="#e8e8e8"
AlternatingItemStyle-ForeColor="Black"
FooterStyle-Font-Size="10pt"
FooterStyle-Font-Italic="true"
FooterStyle-HorizontalAlign="Center">
| 前綴 | 適用範圍 | 常用屬性 |
|---|---|---|
| HeaderStyle | HeaderTemplate | BackColor, ForeColor, Font-Bold, HorizontalAlign |
| ItemStyle | ItemTemplate (奇數行) | BackColor, ForeColor, Font-Name, Font-Size, Wrap |
| AlternatingItemStyle | AlternatingItemTemplate (偶數行) | BackColor, ForeColor(建議與 ItemStyle 形成對比) |
| SelectedItemStyle | 選取項目 | BackColor, Font-Bold, BorderStyle |
| EditItemStyle | 編輯模式 | BackColor, Font-Italic |
| FooterStyle | FooterTemplate | Font-Size, Font-Italic, HorizontalAlign |
| SeparatorStyle | SeparatorTemplate | BackColor, Height |
<ItemTemplate>
<tr class="item-row">
<td><%# Eval("title") %></td>
<td><%# Eval("artist") %></td>
<td>$<%# Eval("price") %></td>
</tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr class="alt-row">
<td><%# Eval("title") %></td>
<td><%# Eval("artist") %></td>
<td>$<%# Eval("price") %></td>
</tr>
</AlternatingItemTemplate>
搭配 CSS:.item-row { background:#fff; } .alt-row { background:#f5f5f5; } 效果更佳且易維護。
<asp:DataList ID="dlCatalog" runat="server"
DataKeyField="id"
OnSelectedIndexChanged="dlCatalog_SelectedIndexChanged"
OnEditCommand="dlCatalog_EditCommand"
OnUpdateCommand="dlCatalog_UpdateCommand"
OnCancelCommand="dlCatalog_CancelCommand"
OnDeleteCommand="dlCatalog_DeleteCommand">
<ItemTemplate>
<tr>
<td><%# Eval("title") %></td>
<td><asp:LinkButton CommandName="Select" Text="選取" runat="server" /></td>
<td><asp:LinkButton CommandName="Edit" Text="編輯" runat="server" /></td>
<td><asp:LinkButton CommandName="Delete" Text="刪除" runat="server"
OnClientClick="return confirm('確定刪除?');" /></td>
</tr>
</ItemTemplate>
<SelectedItemTemplate>
<tr style="background:#ffffcc;">
<td><%# Eval("title") %></td>
<td colspan="3">已選取:<%# Eval("artist") %></td>
</tr>
</SelectedItemTemplate>
<EditItemTemplate>
<tr>
<td><asp:TextBox ID="txtTitle" Text='<%# Eval("title") %>' runat="server" /></td>
<td><asp:TextBox ID="txtArtist" Text='<%# Eval("artist") %>' runat="server" /></td>
<td><asp:LinkButton CommandName="Update" Text="更新" runat="server" /></td>
<td><asp:LinkButton CommandName="Cancel" Text="取消" runat="server" /></td>
</tr>
</EditItemTemplate>
</asp:DataList>
void dlCatalog_EditCommand(object source, DataListCommandEventArgs e) {
dlCatalog.EditItemIndex = e.Item.ItemIndex;
BindData(); // 重新繫結
}
void dlCatalog_UpdateCommand(object source, DataListCommandEventArgs e) {
TextBox txtTitle = (TextBox)e.Item.FindControl("txtTitle");
TextBox txtArtist = (TextBox)e.Item.FindControl("txtArtist");
string id = dlCatalog.DataKeys[e.Item.ItemIndex].ToString();
// 執行資料庫更新...
dlCatalog.EditItemIndex = -1;
BindData();
}
void dlCatalog_DeleteCommand(object source, DataListCommandEventArgs e) {
string id = dlCatalog.DataKeys[e.Item.ItemIndex].ToString();
// 執行資料庫刪除...
BindData();
}
| 特性 | Repeater | DataList | GridView |
|---|---|---|---|
| 渲染結構 | 無預設(完全自訂) | 預設 <table> | 預設 <table>(功能最豐富) |
| 內建分頁 | 無 | 無 | 支援 (AllowPaging) |
| 內建排序 | 無 | 無 | 支援 (AllowSorting) |
| 內建編輯/刪除 | 無 | 支援 (模板+命令事件) | 支援 (AutoGenerateEditButton) |
| 樣式屬性豐富度 | 低 | 高 | 最高 |
| 效能 | 最佳 | 良好 | 較重(ViewState 大) |
| 適用場景 | 高度客製化版面 | 網格式資料、需互動 | 標準資料表格、完整 CRUD |
DataSource 資料集是否有 Table、DataBind() 是否呼叫、XPath/欄位名稱拼寫GridLines 與 CSS border 衝突、樣式屬性前綴拼寫錯誤DataKeyField 未設定、CommandName 拼寫錯誤(區分大小寫)、EditItemIndex 未重置DataList 以表格導向渲染與豐富樣式屬性,是介於 Repeater 輕量與 GridView 重型之間的優選方案。下一節將深入探討 Repeater 控制項的極致客製化能力。