【问题标题】:Get current cell value in DBGrid获取 DBGrid 中的当前单元格值
【发布时间】:2015-10-15 05:29:52
【问题描述】:

在我的 Delphi 应用程序中,我使用了查找字段,但以不同寻常的方式。实际上,我想更新基础数据集中的字段,就像它在同一个表中一样。

现有的指南说没有问题,只需加入表格,瞧……我羡慕他们真的以如此简单的解决方案成功完成了这项任务。我不。顺便说一句,我想我已经接近实现我的目标了。我还有一个问题:我到底如何才能获得我刚刚输入 DBGrid Cell 的值?

我尝试了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 连接。我希望解决方案尽可能简单。

【问题讨论】:

    标签: oracle delphi ado lookup-tables


    【解决方案1】:

    我假设您谈论的是标准 TDBGrid,并且您要问的是如何获取在您输入网格单元格时显示在网格单元格中的文本,但在更新网格数据集之前。此时,LH 列中的当前行指示器将从默认的右向三角形变为 I 形

    如果是这样,下面的 sn-p 将向您展示如何获取此文本值。关键是,在我所描述的情况下,单元格中的内容尚未发布回基础数据集字段。发生的情况是,当您开始编辑时,会动态创建一个 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;
    

    【讨论】:

    • 其实可以的。实际上并没有帮助我解决 X 问题部分,因为 OnFieldChange 事件以不可预测的方式被调用 :( 我接受,因为这是我询问的答案。
    • 谢谢。为什么不尝试解释一下您在新 q 中仍然遇到的问题?
    • 您非常友善、慷慨和周到地提名此答案作为赏金。我很感激。
    猜你喜欢
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    相关资源
    最近更新 更多