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 DataGrid + DataGridCheckBoxColumn,綁定 bool? 屬性,MVVM 雙向綁定零代碼處理狀態同步。