首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

DataGridView CheckBox 列深度解析:FormattedValue vs EditedFormattedValue 陷阱

     編輯:ASP.NET 基礎

核心痛點

DataGridViewCheckBoxCell 沒有 Checked 屬性,必須通過 FormattedValue(已確認值)與 EditedFormattedValue(編輯中值)區分狀態,否則易出現「勾選了但取值為 false」的 Bug。

兩屬性區別

屬性含義更新時機
FormattedValue用戶確認後的值(離開單元格/提交行)CellEndEdit / RowValidated
EditedFormattedValue用戶當前操作的值(含未確認)每次點擊/按鍵即時更新

場景演示

// 初始:未勾選
// 用戶點擊一次 → 勾選
// 此時:EditedFormattedValue = true, FormattedValue = false (未確認)

// 用戶點擊其他單元格 → 離開確認
// 此時:EditedFormattedValue = true, FormattedValue = true

// 初始:已勾選
// 用戶點擊一次 → 取消勾選,然後點擊其他單元格
// 此時:EditedFormattedValue = false, FormattedValue = false

正確獲取「用戶最終意圖」的代碼

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    var cell = row.Cells["CheckCol"] as DataGridViewCheckBoxCell;
    if (cell == null) continue;

    // 方案 1:優先取編輯中值,回退到已確認值
    bool isChecked = Convert.ToBoolean(cell.EditedFormattedValue) || Convert.ToBoolean(cell.FormattedValue);

    // 方案 2:強制結束編輯再取值(推薦用於保存前)
    // dataGridView1.EndEdit(); // 觸發 CellEndEdit 同步 FormattedValue
    // bool isChecked = Convert.ToBoolean(cell.FormattedValue);

    if (isChecked) { /* 處理選中行 */ }
}

常見坑點與對策

  • 直接轉型失敗:cell.Value 可能為 DBNull、null、bool、int。務必用 Convert.ToBoolean 安全轉換。
  • 虛擬模式:需在 CellValuePushed 同步底層數據源。
  • 三態檢查框:設置 ThreeState = true,值為 CheckState.Indeterminate,轉換邏輯更複雜。
  • 只讀列:ReadOnly = true 時無法交互,FormattedValue 直接反映數據源。

現代替代:WPF / WinUI / Blazor

新桌面項目首選 WPF DataGrid + DataGridCheckBoxColumn,綁定 bool? 屬性,MVVM 雙向綁定零代碼處理狀態同步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved