2015-10-15 36 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

相关问题