获取 DBGrid 中的当前单元格值
Get current cell value in DBGrid
在我的 Delphi 应用程序中,我使用查找字段,但使用的方式不同寻常。实际上,我想更新基础数据集中的字段,就像它在同一个 table.
中一样
现有指南告诉我们没有问题,只需加入 table,瞧...我很羡慕他们是否真的用如此简单的解决方案成功完成了这项任务。我不。顺便说一句,我认为我正在接近实现我的目标。我还有一个问题:我 刚刚 进入 DBGrid Cell,我怎么能得到值?
我尝试了 DBGrid[FieldName].EditValue
和 .DisplayText
,但它们显示的值与 Field.Value
相同,退出列后不会改变,因为它是查找字段。 Sender.NewValue
为空。我正在使用此功能来更新查找 table:
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连接。我希望解决方案尽可能简单。
我假设您是在谈论标准的 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;
在我的 Delphi 应用程序中,我使用查找字段,但使用的方式不同寻常。实际上,我想更新基础数据集中的字段,就像它在同一个 table.
中一样现有指南告诉我们没有问题,只需加入 table,瞧...我很羡慕他们是否真的用如此简单的解决方案成功完成了这项任务。我不。顺便说一句,我认为我正在接近实现我的目标。我还有一个问题:我 刚刚 进入 DBGrid Cell,我怎么能得到值?
我尝试了 DBGrid[FieldName].EditValue
和 .DisplayText
,但它们显示的值与 Field.Value
相同,退出列后不会改变,因为它是查找字段。 Sender.NewValue
为空。我正在使用此功能来更新查找 table:
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连接。我希望解决方案尽可能简单。
我假设您是在谈论标准的 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;