当在DBGrid中输入数据时,用向上,向下箭头也能够进行保存,这没错吧,但是如果在新增的一行里从来没有输入数据的话,用向上箭头将光标往上移一行,就不会出错,但如果在这一行输入过数据,然后,再向上移光标,那么,此时如果主键对应的列是空的话就会报错,而且会退出系统,我要做的是将这个错误拦住,然后给用户一个提示,同时,不退出系统,让光标仍停在原来的单元格。
不知道我说清楚了没有?
请大家帮帮我,我已被这个折磨很久了,找的一些资料好象也没有解决。先谢了。

解决方案 »

  1.   

    try
      Table1.Append;
      ...........
      Table1.Post;
     except
      Table1.Cancel
      ShowMessage('你的错误信息');
     end;
      

  2.   

    procedure TForm1.ADODataSet1BeforePost(DataSet: TDataSet);
    beginend;procedure TForm1.ADODataSet1PostError(DataSet: TDataSet; E: EDatabaseError;
      var Action: TDataAction);
    beginend;
      

  3.   

    pengxuan(追梦人) 的做法最经典,我在这里没有什么好说的了,但最好对生成的异常号做一些筛选,以免什么异常都跑出这条信息来!!
      

  4.   

    我这些天其实也遇到和你一样的问题。不过我现在已经解决了。我知道你的意思。你是要在DBGRID里面实现录入。然后还要对录入的记录进行合法性检查。但是DBGRID有自动提交修改后的记录的功能。也就是说你只要把光标移开当前记录,它就会自动调用POST方法对刚才的记录进行保存。但是APPEND后的记录的主键值可能是空的。这时候用户要是把光标移到其他记录的话。DBGRID自动调用POST方法后就会产生异常。解决办法是象‘东少爷’说的那样。在ADOQUERY中的BEFORPOST事件中判断一下字段值是否为空就行了,若为空则显示出错信息。然后ABORT。代码如下。
      procedure TForm1.ADODataSet1BeforePost(DataSet: TDataSet);
    begin
       if adoquery1.filedbyname('字段名').asstring='' then 
           begin
           showmessage('主键值不能为空!');
           abort; 
           end   
       else 
           adoquery1.post;
    end;
      

  5.   

    procedure TForm1.ADOQuery1BeforePost(DataSet: TDataSet);
    begin
      if ADOQuery1.FieldByName('主键').AsString = '' then
        Raise Exception.Create('主键不能为空!')
    end;
      

  6.   

    再beforepost事件中验证 和try except结构都可以实现。
    不过用dbgird录入数据的话有时候可能造成数据的丢失。慎用其作为数据录入的窗口
      

  7.   

    同意 coffee36(咖啡) 的做法
      

  8.   

    我也赞同 coffee36(咖啡) 的做法,测试通过!!
      

  9.   

    结了,结了,
    别的方法我没有去试(暂进没有时间),但coffee36(咖啡)的方法我已经试过了,很好,现在就是用这段代码。