傳統做法:在 `ItemTemplate` 放 `DropDownList`,`RowDataBound` 手動填項、設定 `SelectedValue`、取值時再解析。程式碼分散、難維護、重用性低。
<%@ Register TagPrefix="nb" Namespace="NBear.Web.Data" Assembly="NBear.Web.Data" %>
<asp:GridView ID="TestGrid" runat="server" DataSourceID="TestDS" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="SimpleId" HeaderText="ID" />
<asp:BoundField DataField="SimpleName" HeaderText="名稱" />
<nb:DropDownListField DataField="Status" HeaderText="狀態" SortExpression="Status"
EnumType="EntityDesigns.SimpleStatus" />
</Columns>
</asp:GridView>
public enum SimpleStatus
{
[NBear.Common.EnumDescription(DefaultDescription = "待處理")]
Pending = 1,
[NBear.Common.EnumDescription(DefaultDescription = "處理中")]
Processing = 2,
[NBear.Common.EnumDescription(DefaultDescription = "已完成")]
Completed = 3
}
// 位元組合 Enum (Flags)
[Flags]
public enum Permissions
{
[EnumDescription(DefaultDescription = "讀取")]
Read = 1,
[EnumDescription(DefaultDescription = "寫入")]
Write = 2,
[EnumDescription(DefaultDescription = "執行")]
Execute = 4,
[EnumDescription(DefaultDescription = "管理")]
Admin = Read | Write | Execute
}
| 傳統做法 | DropDownListField 方案 |
|---|---|
| 需手寫 ItemTemplate + DropDownList | 純聲明式,零程式碼 |
| RowDataBound 手動繫結項目 | 自動讀取 Enum 成員與 Description |
| 編輯模式需額外處理 SelectedValue | 內建編輯/插入模式雙向繫結 |
| 多語系需自行擴充 | EnumDescription 支援 Culture 特定描述 |
| Flags Enum 無法直接多選 | 支援位元組合值自動拆解多選 |
NBear 為開源 ORM 框架,`NBear.Web.Data` 組件可從 NuGet 或官方網站取得。若專案未引入 NBear,亦可參考其原始碼自行實作類似 `DataControlField`。
`DropDownListField` + `EnumDescriptionAttribute` 將 Enum 繫結從「程式碼堆疊」提升為「聲明式配置」,徹底解決顯示描述、編輯雙向繫結、多語系、Flags 多選等痛點,是 ASP.NET Web Forms 處理 Enum 欄位的最佳實踐。