首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

DevExpress GridView:RowCellClick 與 MouseDown 事件衝突解決方案

     編輯:關於C++

問題場景

GridView 處於可編輯狀態,左鍵點擊單元格默認進入編輯模式,不觸發 RowCellClick。若設 OptionsColumn.AllowEdit = false 則可觸發點擊,但失去編輯能力。需求:既可編輯,又能在特定列點擊彈窗選值回填。

解決方案:使用 MouseDown 事件

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 事件,便於後續驗證/保存邏輯

行為差異表

設置左鍵單擊行為RowCellClickMouseDown
AllowEdit=true進入編輯不觸發觸發 ✓
AllowEdit=false選中行觸發 ✓觸發 ✓
AllowEdit=true + MouseDown處理自定義不觸發觸發 ✓ (推薦)

注意事項

  • 無論 AllowEdit 如何,有 MouseDown 處理的列不會觸發 RowCellClick
  • 若需雙擊編輯、單擊彈窗,可在 MouseDown 中判斷 e.Clicks == 1 vs ==2
  • 編輯器彈出後 MouseDown 仍會觸發,注意避免重複處理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved