GridView 處於可編輯狀態,左鍵點擊單元格默認進入編輯模式,不觸發 RowCellClick。若設 OptionsColumn.AllowEdit = false 則可觸發點擊,但失去編輯能力。需求:既可編輯,又能在特定列點擊彈窗選值回填。
MouseDown 發生在編輯模式進入之前,可攔截特定列點擊並手動處理。
private void gViewActPara_MouseDown(object sender, MouseEventArgs e) {
GridHitInfo hit = gViewActPara.CalcHitInfo(e.X, e.Y);
// 基礎校驗
if (gViewActPara.RowCount == 0 || !hit.InRowCell || e.Button != MouseButtons.Left || e.Clicks != 1)
return;
// 目標列判斷
if (hit.Column.FieldName == "需要彈窗的列名") {
// 強制同步焦點行(滑鼠點擊行與焦點行可能不同步)
gViewActPara.FocusedRowHandle = hit.RowHandle;
// 彈窗選值邏輯...
object val = ShowSelectionDialog();
if (val != null) {
// 回填數據(觸發 CellValueChanged)
gViewActPara.SetRowCellValue(hit.RowHandle, "目標列FieldName", val);
}
}
}
CalcHitInfo 獲取點擊位置對應的行/列信息hit.InRowCell 確保點擊在數據單元格內(非標題、空白區)FocusedRowHandle = hit.RowHandle 關鍵:滑鼠點擊時焦點行尚未切換,必須手動同步SetRowCellValue 直接賦值,會觸發 CellValueChanged 事件,便於後續驗證/保存邏輯| 設置 | 左鍵單擊行為 | RowCellClick | MouseDown |
|---|---|---|---|
| AllowEdit=true | 進入編輯 | 不觸發 | 觸發 ✓ |
| AllowEdit=false | 選中行 | 觸發 ✓ | 觸發 ✓ |
| AllowEdit=true + MouseDown處理 | 自定義 | 不觸發 | 觸發 ✓ (推薦) |
AllowEdit 如何,有 MouseDown 處理的列不會觸發 RowCellClickMouseDown 中判斷 e.Clicks == 1 vs ==2MouseDown 仍會觸發,注意避免重複處理