如果Dbgrid是与Table相连,请在Table的Column的OnSetText和OnValidate事件中处理。
  1、在OnSetText中判断数据的合法性,如果不合法,在OnValidate处理(通过标志等)
  2、抛出一个异常Raise,即可保证焦点不会丢失。

解决方案 »

  1.   

    也可以在Table1.BeforePost里面处理,如果不符合要求,ShowMessage(""),然后Abort;
      

  2.   


      DBGrid1.SetFocus;
      DBGrid1.SelectedField :=
        DBGrid1.DataSource.DataSet.FieldByName('你的字段名');
      SendMessage(DBGrid1.Handle, WM_KEYDOWN, VK_F2, 0);
      

  3.   

    可以用DBGrid1ColExit事件进行。
    procedure TForm1.DBGrid1ColExit(Sender: TObject);
    begin
      case DBGrid1.SelectedIndex of
        0:if DBGrid1.DataSource.DataSet.Fields[0].value<>'我想要的值' then
          于吗于吗。
        1:
       ..
      end;
    end;
    或可在用OnValidate进行过滤。
    procedure tform1.oncreate
    begin
      with yourdateset do
      begin
        fieldbyname('field1').onvvalidate:=MyFieldValidate;
        fieldbyname('field1').onvvalidate:=MyFieldValidate; 
      end; 
    end;
    procedure TForm1.MyFieldValidate(Sender as TField);
    var fieldname:string;
    begin
      fieldname:=(Sender as TField).FieldName;
      if fieldname='field1' then
      begin
        if dataset1.fieldbyname('field1').asinteger>10000 then
        begin
           showmessage('在field1字段中不能输入超过10000的数.');
           fieldbyname('field1').asinteger:=0;
           abort;
        end;
      end;
    end;