首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++Builder DBGrid 雙擊獲取記錄值錯誤:需用 Sender 獲取當前行數據源

     編輯:程式設計綜合問答

問題現象

雙擊 DBGrid 任意行,ADODataSet1.FieldByName("員工號").AsString 永遠返回第一行(001)的值。

根因

代碼直接用 ADODataSet1(綁定整個表的數據集),而非**當前點擊行所在的數據集**。DBGrid 雙擊時,當前行已切換,但代碼沒用事件參數獲取對應行的數據源。

修正代碼:在 OnDblClick 事件中用 Sender 關聯

void __fastcall TForm1::DBGrid1DblClick(TObject *Sender) {
    TDBGrid *grid = dynamic_cast<TDBGrid*>(Sender);
    if (!grid || !grid->DataSource || !grid->DataSource->DataSet || 
        grid->DataSource->DataSet->RecordCount <= 0) return;

    // 關鍵:用 grid->DataSource->DataSet 獲取當前行數據
    AnsiString empNo = grid->DataSource->DataSet->FieldByName("員工號")->AsString;
    
    AnsiString sql = "SELECT 頭像 FROM Photo WHERE 員工號 = '" + empNo + "'";
    ADOQuery1->Close();
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add(sql);
    ADOQuery1->Open();
    
    AnsiString path = ADOQuery1->FieldByName("頭像")->AsString;
    Image1->Picture->LoadFromFile(path);
}

關鍵點

錯誤寫法正確寫法說明
ADODataSet1.FieldByName(...)grid->DataSource->DataSet->FieldByName(...)Sender 關聯的 DataSource 才是當前行所屬數據集
無空檢查檢查 grid/DataSource/DataSet/RecordCount防空指針崩潰
字段值拼接 SQL參數化查詢 Parameters.ParamByName防注入、處理特殊字符

補充:員工號字段類型判斷

若 員工號 是數字類型,SQL 條件**不要加單引號**:WHERE 員工號 = " + empNo。建議統一用參數化避免此類問題。

總結

DBGrid 雙擊獲取當前行數據,**必須通過 Sender 強轉為 TDBGrid,再取其 DataSource->DataSet**,而非直接用表單級數據集組件。加上空檢查與參數化查詢,代碼才健壯。

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