关于在DBGRID中修改某一列值后改变其它列值的问题。

时间:2022-10-17 09:55:30
在DBGRID的KEYPRESS事件中,我写了一些代码,当改变某一列的值并按下INSERT键后,程序会在其它表中查找对应的信息。如果找到,会在另一列中显示相应信息。例如有两列:代码、名称。在代码列中输入值后按INSERT键,程序会在其它表中查找有无对应的名称,如找到,在名称列中写入对应信息,否则弹出警告框。
现在的问题是当我按下INSERT键后不管有无对应信息,程序都说没找到对应信息,只有外加一个BUTTON的事件,才能正确返回信息(似乎在判断时必须离开当前列),怎么回事?附代码:
procedure Twhrkgl_rkForm.dxDBGrid2Column1ButtonClick(Sender: TObject;
  AbsoluteIndex: Integer);
begin
if (dxdbgrid2.FocusedField.fieldname='物品代码') then //dxdbgrid2为一个类似于DBGRID 的控件
begin
  dataunit.DataModule1.adoquery5.edit;
  dxdbgrid2.FocusedField.Text:=trim(dxdbgrid2.FocusedField.Text);
  dataunit.DataModule1.adoquery3.close;
  dataunit.DataModule1.adoquery3.sql.clear;
  dataunit.DataModule1.adoquery3.SQL.Add('select * from 库存物品表 where 物品代码=:物品代码 ');
  dataunit.DataModule1.adoquery3.Parameters.ParamByName('物品代码').value:=dxdbgrid2.FocusedField.Text;
  dataunit.DataModule1.adoquery3.open;
  if dataunit.DataModule1.adoquery3.RecordCount=0 then
  begin
   application.MessageBox('此库存信息不存在!','提示',mb_ok+mb_iconinformation);
   dxdbgrid2.FocusedField.Clear;
   dataunit.DataModule1.adoquery5.Cancel;
  end
  else
  begin
   dataunit.DataModule1.adoquery5.fieldbyname('物品名称').asstring:=dataunit.DataModule1.adoquery3.fieldbyname('物品名称').asstring;
   dataunit.DataModule1.adoquery5.post;
  end;
 end;
end;

5 个解决方案

#1


你关键在以下语句后
dataunit.DataModule1.adoquery5.edit;
  dxdbgrid2.FocusedField.Text:=trim(dxdbgrid2.FocusedField.Text);
数据赋值后,没有进行存盘操作,就进行查询操作。在上面语句后面加上:
dataunit.DataModule1.adoquery5.post;
进行存盘试试。

#2


dataunit.DataModule1.adoquery3.RecordCount=0
改成dataunit.DataModule1.adoquery3.isempty

#3


query从数据库中取得的是一个数据流,在没传完recordcount永远是0,你在其他事件中读recordcount时已经传完了,也就有值。上面看了一下判断recordcount=0主要是判断是否为空用isempty要好些,而且没有传输限制。
Query有其他属性可以调整我还不能确定是不是上面的问题,大家可以讨论一下

#4


你的猜想是对的,如果没有移开焦点,事实上还在编辑状态时(光标还在一闪一闪),编辑的内容还没有进入dxdbgrid2.FocusedField中。你可以试一下回车后再Insert,应该就跟用按钮一样了。

所以可能的办法是接到Insert后,让DBGrid虚拟执行一下回车。(DBGrid.Perform(...))。然后再进行处理。

#5


也可以用TDBGridInplaceEdit取回当前没有存盘的数据

#1


你关键在以下语句后
dataunit.DataModule1.adoquery5.edit;
  dxdbgrid2.FocusedField.Text:=trim(dxdbgrid2.FocusedField.Text);
数据赋值后,没有进行存盘操作,就进行查询操作。在上面语句后面加上:
dataunit.DataModule1.adoquery5.post;
进行存盘试试。

#2


dataunit.DataModule1.adoquery3.RecordCount=0
改成dataunit.DataModule1.adoquery3.isempty

#3


query从数据库中取得的是一个数据流,在没传完recordcount永远是0,你在其他事件中读recordcount时已经传完了,也就有值。上面看了一下判断recordcount=0主要是判断是否为空用isempty要好些,而且没有传输限制。
Query有其他属性可以调整我还不能确定是不是上面的问题,大家可以讨论一下

#4


你的猜想是对的,如果没有移开焦点,事实上还在编辑状态时(光标还在一闪一闪),编辑的内容还没有进入dxdbgrid2.FocusedField中。你可以试一下回车后再Insert,应该就跟用按钮一样了。

所以可能的办法是接到Insert后,让DBGrid虚拟执行一下回车。(DBGrid.Perform(...))。然后再进行处理。

#5


也可以用TDBGridInplaceEdit取回当前没有存盘的数据