`DataGrid` 是 ASP.NET 1.x 時代最強大的資料顯示控制項,功能豐富但也最容易誤用。本文歸納實務開發中最高頻的 5 大錯誤,從「重複造輪子」到「ViewState 濫用」,提供修正代碼與架構級建議,助您寫出高效能、可維護的資料表格頁面。
Response.Write("");
while (reader.Read())
{
Response.Write("" + reader[0] + " ");
}
Response.Write("
");
<asp:DataGrid runat="server" ID="grid" DataSourceID="src" />
// 後台
grid.DataSource = reader; // 或 DataTable/DataSet
grid.DataBind();
**理由**:DataGrid 內建分頁、排序、編輯、樣式、事件模型,手工拼接違反 DRY、難以維護、無法受惠於框架優化。
void Page_Load()
{
BindGrid(); // 每次 PostBack 都重新綁定,編輯模式的值被資料庫原值覆蓋
}
void Page_Load()
{
if (!IsPostBack) BindGrid();
}
若 `DataGrid` 動態產生欄位、或依賴 ViewState 還原複雜狀態,**每次 PostBack 都需綁定**。此時應在編輯事件中手動保存使用者輸入,或改用 `ObjectDataSource` 自動管理狀態。
<asp:DataGrid AutoGenerateColumns="True" ...>
<Columns> <!-- 手工加入欄位 --> </Columns>
</asp:DataGrid>
**後果**:自動產生欄位 + 手工欄位 = **重複欄位** (先手工、後自動)。
<asp:DataGrid AutoGenerateColumns="False" ...>
<Columns>
<asp:BoundColumn DataField="Name" HeaderText="姓名" />
<asp:TemplateColumn HeaderText="操作">
<ItemTemplate>
<asp:LinkButton CommandName="Edit" Text="編輯" />
</ItemTemplate>
</TemplateColumn>
</Columns>
</asp:DataGrid>
**原則**:**只要有一點客製化 (格式、按鈕、下拉、驗證),就關閉自動產生,全部欄位顯式宣告。**
grid.DataSource = GetAllMillionRows(); // 一次載入百萬筆
grid.DataBind();
<asp:DataGrid AllowCustomPaging="True"
PageSize="20"
OnPageIndexChanged="Grid_PageIndexChanged" ... />
void Grid_PageIndexChanged(object src, DataGridPageChangedEventArgs e)
{
grid.CurrentPageIndex = e.NewPageIndex;
BindGrid(e.NewPageIndex, e.PageSize); // 只查當頁資料
}
**SQL 配合**:`OFFSET @Offset ROWS FETCH NEXT @PageSize ROWS ONLY` (SQL 2012+) 或 `ROW_NUMBER()` 分頁。
| 策略 | 適用情境 |
|---|---|
| `EnableViewState="false"` (控制項/頁面層級) | 唯讀顯示、無編輯/排序/分頁互動 |
| `ViewStateMode="Disabled"` + 子控制項 `Enabled` | 頁面關閉,局部開啟 (ASP.NET 4.0+) |
| 自訂 `PageStatePersister` 儲存至 Session/快取 | 大型 ViewState、行動裝置頻寬敏感 |
| 改用 `ObjectDataSource` / `SqlDataSource` 自動管理 | 資料源控制項內建分頁/排序不需 ViewState |
| 版本 | 控制項 | 關鍵改進 |
|---|---|---|
| ASP.NET 1.x | DataGrid | 基礎功能、ViewState 重 |
| ASP.NET 2.0+ | GridView | 免程式碼分頁/排序/編輯、資料源控制項、無障礙、樣式強化 |
| ASP.NET Core / 現代 Web | 前端表格 (AG Grid / DataTables / TanStack Table) | 虛擬滾動、客戶端排序/過濾、匯出、彈性欄位、無 ViewState |
DataGrid 雖已退役,但其設計模式——**宣告式欄位、事件驅動編輯、ViewState 狀態管理、資料源抽象**——深刻影響了後續所有 .NET 資料顯示控制項。理解這些常見錯誤與最佳實踐,不僅是維護舊系統的生存技能,更是掌握「資料網格元件設計精髓」的捷徑。