2015-10-15 66 views
3

在我的Delphi應用程序中,我使用查找字段,但以不尋常的方式。實際上,我想更新底層數據集中的字段,就像它在同一個表中一樣。在DBGrid中獲取當前單元格的值

現有的指南告訴我們沒有問題,只需加入表格即可......我很羨慕他們是否真的用這樣簡單的解決方案成功完成了這項任務。我不。順便說一句,我想我正在接近實現我的目標。我還有一個問題:我怎麼能得到價值我只是進入DBGrid單元格?

我試圖DBGrid[FieldName].EditValue.DisplayText,但他們表現出相同的值Field.Value,該柱排出後不會改變,因爲它是查詢字段。 Sender.NewValue爲空。我使用這個功能來更新查詢表:我結束了查找字段之前我用

procedure TKDGridForm.LookupFieldChange(Sender: TField); 
begin 
    if not Assigned(Sender) then 
    Exit; 
    Sender.OnChange := nil; 
    if not Assigned(Sender.LookupDataSet) then 
    Exit; 
    if Sender.LookupDataSet.Locate(Sender.LookupKeyFields, Sender.DataSet[Sender.KeyFields], []) then 
    Sender.LookupDataSet.Edit 
    else 
    Sender.LookupDataSet.Append; 
    // how do I get the value I just entered? 
    Sender.Value := KDGrid3[Sender.FieldName].DisplayText; 
    Sender.LookupDataSet.FieldValues[Sender.LookupResultField] := Sender.Value; 
    Sender.LookupDataSet.Post; 
    Sender.OnChange := LookupFieldChange; 
end; 

這裏是SQL:

select det.*, 
     od1.T_EQ T_SHABLON_EQ, 
     od1.T_NV T_SHABLON_NV, 
     od1.T_PRIM T_SHABLON_PRIM, 
     od2.T_EQ T_PRAVKA_EQ, 
     od2.T_NV T_PRAVKA_NV, 
     od2.T_PRIM T_PRAVKA_PRIM, 
     od3.T_EQ T_VALCOV_EQ, 
     od3.T_NV T_VALCOV_NV, 
     od3.T_PRIM T_VALCOV_PRIM, 
     od4.T_EQ T_REZKA2_EQ, 
     od4.T_NV T_REZKA2_NV, 
     od4.T_PRIM T_REZKA2_PRIM 
from CMKNEW.details det 
left join CMKNEW.OperDetails od1 
     ON det.nrec = od1.cdetail 
     and 81 = od1.coper 
left join CMKNEW.OperDetails od2 
     ON det.nrec = od2.cdetail 
     and 82 = od2.coper 
left join CMKNEW.OperDetails od3 
     ON det.nrec = od3.cdetail 
     and 83 = od3.coper 
left join CMKNEW.OperDetails od4 
     ON det.nrec = od4.cdetail 
     and 84 = od4.coper 
where det.ckd=:CKD order by det.NREC 

希望它會解釋我的任務更加清晰。如果你想要mcve,我可以擴展它,但我認爲它不是必需的。

我的數據庫是Oracle,通過ADO連接。我希望解決方案儘可能簡單。

回答

1

我假設你正在談論一個標準的TDBGrid,並且你所要求的是如何獲取當你鍵入網格時,但在網格數據集更新之前顯示在網格單元格中的文本。此時,LH列中的當前行指示符將從默認的右指向三角形變爲工字鋼

如果是這樣,下面的代碼片段將向您顯示如何獲取此文本值。關鍵是,在我所描述的條件下,單元格中的內容尚未返回到底層數據集字段。會發生什麼情況是,當你開始編輯時,動態創建一個InplaceEditor(TCustomMaskEdit後代),並且它保存正在編輯的文本值。

將TTimer和TMemo添加到您的表單中,然後運行下面的代碼以查看我的意思。

type 
    TMyGrid = Class(TDBGrid); 

procedure TMyForm.Timer1Timer(Sender: TObject); 
var 
    S : String; 
    Grid : TmyGrid; 
begin 
    Grid := TmyGrid(DBGrid1); 
    if Grid.InplaceEditor <> Nil then 
    S := Grid.InplaceEditor.Text 
    else 
    S := IntToStr(Grid.Col) + ':' + IntToStr(Grid.Row); 
    Grid.Invalidate; 
    Memo1.Lines.Insert(0, S); 
end; 
+0

其實它的工作原理。而實際上並沒有幫助我解決X問題,因爲OnFieldChange事件以不可預知的方式被調用:(我接受,因爲它是我詢問的答案。 – Danatela

+0

謝謝。爲什麼不嘗試解釋你仍然存在的問題新q? – MartynA

+0

這是非常善良,慷慨和深思熟慮的提名這個答案的賞金,我很感激。 – MartynA

相關問題