用DBEdit在修改一个字段时,如果用户输入的数据不符,如何恢复原来的数据?我是用ADO连接数据表的,并且采用了缓存模式,且DBEdit1的Field是一对多关系中的主表中的关联字段。
 试了以下几种方法都不行
我在OnExit中输入如下代码
if xxxxxxxxxxxxx then
begin
  DBEdit1.SetFocus;
  DBEdit1.Refresh;         //让DBEdit1显示未修改前的数据,这样不行。
  ShowMessage('输入的数据重复,请重新输入');
end;
改成
if XXXXX then
   begin
     DBEdit1.SetFocus;
     DBEdit1.Text:=DBEdit1.Field.OldValue;
     DBGridEh1.Refresh;
     ShowMessage('您输入的数据重复');
   end;
end;
执行这段代码报错:
Project Project1.exe raised exception class EDatabaseError with
message 'ADODataSet1:Dataset not in edit or insert mode'. Process
stopped. Use Step or Run to continue.改成
if XXXXX then
  begin
    DBEdit1.SetFocus;
    DBEdit1.DataSource.DataSet.Refresh;
    DBEdit1.DataSource.DataSet.Edit;
    ShowMessage('输入的数据错误,请重新输入');
  end;
end;
执行这段代码报错:
Project Project1.exe raised exception class EDatabaseError with
message '缺少更新或刷新的键列信息。'Process stopped. Use Step or
Run to continue.
该怎么办呐?大侠们帮着来看看。

解决方案 »

  1.   

    你的EDIT位置不对啊,因在事件发生之前就EDIT吗
      

  2.   

    if xxxxxxxxxxxxx then
    begin
      DBEdit1.SetFocus;
      adoquery1.close;
    adoquery1.open;         //这样试试。
      ShowMessage('输入的数据重复,请重新输入');
    end;
      

  3.   

    我赞成  ayukowa(野狼)做法;    不过你也可这样试试:
         if XXXXX then
               begin
               DBEdit1.SetFocus;
               DBEdit1.text:=ADOquery.parambyname('字段名').asstring;
               //直接去数据表中提取值;
               ShowMessage('输入的数据错误,请重新输入');
      end;
      

  4.   

    用ayukowa(野狼)的方法,每次open后DBEdit只显示表中的第一笔数据,旧的数据全部丢失
    用 wellshddelphi(wellshd)的方法,从表却不能够与主表保持关联。
      

  5.   

    用wellshddelphi(wellshd) (的方法:
    f XXXXX then
               begin
               DBEdit1.SetFocus;
               DBEdit1.text:=ADOquery.parambyname('字段名').asstring;
               //直接去数据表中提取值;
               ShowMessage('输入的数据错误,请重新输入');
      end;
    可以搞定,只是提取当前行的某个字段值,没有影响主从表关系。
    你的主从表不能保持关联,肯定另有其它原因。
    如果真的不行,就用个变量吧,在onenter事件中记录原始值,
    输入不正时,再还原
      

  6.   

    现在是可以恢复旧的数据,但却影响了主从表关系。当输入新的值后,从表跟着变化。用上面的代码恢复DBEdit1的值,从表却不变回来,变成DBEdit与从表不能够保持关联。