在 ASP.NET Web Forms 開發中,處理 GridView 編輯模式下的數據提取一直是開發者常遇到的場景。許多開發者仍習慣使用 FindControl 方法在單元格中查找控件並獲取值,例如:
var txtName = grid1.Rows[e.RowIndex].Cells[0].FindControl("txtName") as TextBox;
if (txtName != null)
{
// 讀取值
}
其實,ASP.NET 已經將這套「查找控件並提取值」的邏輯封裝在 ExtractValuesFromCell 方法中,並被多種列類型支援,包括 DataControlField、BoundField、AutoGeneratedField、CheckBoxField、ImageField、TemplateField、DynamicField 等。你可以在 RowUpdating、RowDeleting 等事件中直接調用它,將值提取到 e.Keys、e.NewValues、e.OldValues 等字典中,隨後再從字典讀取,極大簡化代碼。
protected void grid1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
var row = grid1.Rows[e.RowIndex];
// 提取主鍵 Id(第 0 列)
grid1.Columns[0].ExtractValuesFromCell(
e.Keys,
row.Cells[0] as DataControlFieldCell,
DataControlRowState.Edit,
true /* include readonly */);
// 提取 Name 欄位(第 1 列)
grid1.Columns[1].ExtractValuesFromCell(
e.NewValues,
row.Cells[1] as DataControlFieldCell,
DataControlRowState.Edit,
true /* include readonly */);
var id = int.Parse(e.Keys["id"].ToString());
var name = (string)e.NewValues["name"];
// 執行資料庫更新操作
// ...
}
FindControl、類型轉換、空值判斷。includeReadOnly 可控制是否包含唯讀欄位值。掌握 ExtractValuesFromCell,能讓 GridView 編輯邏輯更乾淨、可維護性更強,是每位 ASP.NET 開發者應掌握的進階技巧。