ASP.NET `DataGrid` 欄位通常在設計階段透過屬性建立器或 HTML 標記靜態定義,專案上線後若需調整欄位顯示,往往需修改代碼重新部署。本文示範如何利用 `DataGridColumnCollection` 在**執行期動態新增、隱藏、移除欄位**,並透過 `Visible` 屬性控制顯示狀態,打造靈活的動態報表介面。
DataGrid.Columns:回傳 `DataGridColumnCollection` 集合DataGridColumnCollection.Add(column):新增欄位DataGridColumnCollection.Remove(column) / RemoveAt(index):移除欄位DataGridColumn.Visible:控制欄位顯示/隱藏(保留於集合中)private void CreateDataGrid()
{
// 關鍵:關閉自動產生欄位
DataGrid1.AutoGenerateColumns = false;
// 取得資料來源(示範用自訂 DB.GetDataSet())
DataSet ds = DB.GetDataSet();
// 動態建立三個 BoundColumn
BoundColumn col = new BoundColumn();
col.HeaderText = "User ID";
col.DataField = "ID";
DataGrid1.Columns.Add(col);
col = new BoundColumn();
col.HeaderText = "User Name";
col.DataField = "Name";
DataGrid1.Columns.Add(col);
col = new BoundColumn();
col.HeaderText = "User Address";
col.DataField = "Address";
DataGrid1.Columns.Add(col);
// 綁定資料
DataGrid1.DataSource = ds.Tables[0];
DataGrid1.DataBind();
}
private void FillColumnsList()
{
DropDownList1.Items.Clear();
foreach (DataGridColumn col in DataGrid1.Columns)
{
DropDownList1.Items.Add(new ListItem(col.HeaderText, col.DataField));
}
}
protected void btnHide_Click(object sender, EventArgs e)
{
string dataField = DropDownList1.SelectedValue;
DataGridColumn col = DataGrid1.Columns.Cast()
.FirstOrDefault(c => c.DataField == dataField);
if (col != null) col.Visible = false;
}
protected void btnShow_Click(object sender, EventArgs e)
{
string dataField = DropDownList1.SelectedValue;
DataGridColumn col = DataGrid1.Columns.Cast()
.FirstOrDefault(c => c.DataField == dataField);
if (col != null) col.Visible = true;
}
| 場景 | 實作要點 |
|---|---|
| 使用者自訂報表欄位 | 儲存 `Visible` 狀態至 Profile/資料庫,下次登入自動還原 |
| 權限控制敏感欄位 | `Page_Load` 依角色動態 `Visible = (User.IsInRole("Admin"))` |
| 完全移除欄位(非隱藏) | `DataGrid1.Columns.Remove(col)` 或 `RemoveAt(index)`,節省 ViewState |
| 執行期新增計算欄位 | 用 `TemplateColumn` + `ItemTemplate` 動態注入運算邏輯 |
掌握 `DataGridColumnCollection` 操作,能讓報表介面從「死板的靜態定義」進化為「使用者可配置、權限可控、業務可擴充」的動態儀表板,是 WebForms 開發者必備的進階技能。