cxgrid的editing设为true后,直接编辑表格里的值,编辑完毕点击其它行,可以直接保存到数据库;但如果表格里只有一行,直接在表格里编辑后失去焦点,就不会直接保存到数据库。有什么方法可以解决这个问题吗?

解决方案 »

  1.   

    這個太簡單了吧?因為只有一筆數據的話,你的焦點無法失去,永遠都會在第一行,所以加個boolean變量判斷處理一下。
      

  2.   

    代碼說話:1.先定義一個全局變量isSave:Boolean;
    2.窗體在create時先isSave:=False;
    3.保存時:
    procedure TRes_Cq_HrQj_F.btnSB_SaveClick(Sender: TObject);
    begin
      inherited;
      if not btnSB_New.Enabled then
      begin
        if (Trim(cx_jb.Text)='') and  //這裡條件改成你表格單元格所對應的字段值+判斷
           (Trim(cx_gh.Text)='') and  //這裡條件改成你表格單元格所對應的字段值+判斷
           (Trim(cx_qjlb.Text)='') and //這裡條件改成你表格單元格所對應的字段值+判斷
           (Trim(cx_sqrq.Text)='') and  //這裡條件改成你表格單元格所對應的字段值+判斷
           (Trim(cx_ksrq.Text)='') and  //這裡條件改成你表格單元格所對應的字段值+判斷
           (Trim(cx_jsrq.Text)='') and  //這裡條件改成你表格單元格所對應的字段值+判斷
           (Trim(cx_qjyy.Text)='') then //這裡條件改成你表格單元格所對應的字段值+判斷
        begin
          MessageDlg('操作提示:數據不完整,如果不保存請點擊“取消”終止操作!',mtWarning,[mbOK],0);
          exit;
        end;
        if qry_hrqj.State in [dsedit,dsinsert] then
        begin
          try
            isSave:=true;
            qry_hrqj.Post;
          finally
            ChangeStatus(sBrowse);//數據為瀏覽模式,自定義的過程
          end;  
        end;
      end;
    end;
    4.在ado的BeforePost事件中:
    procedure TRes_Cq_HrQj_F.qry_hrqjBeforePost(DataSet: TDataSet);
    begin
      inherited;
      if not isSave then
      begin
        MessageDlg('操作提示:當前數據還未“保存”!請點擊“保存”來保存數據,如果不保存請點“取消”終止操作!',mtWarning,[mbOK],0);
        Abort;
      end;
      isSave:=False;
    end;
    5.問題解決
      

  3.   

    这个好说,按照下面方法,既可以在输入完后,回车即可,失去焦点也可以保存自定义一个SetText过程procedure FieldSetText(Sender: TField; const Text: string);代码为(假如使用的 ADOQuery1)
    begin
      ADOQuery1.Edit;
      ADOQuery1.FieldByName(Sender.FieldName).AsString := Text;
      ADOQuery1ata.Post;
    end;然后在ADOQuery1的AfterOpen事件中写入var
      i: Integer;
    begin
      for i := 0 to ADataSet.FieldCount - 1 do
      begin
        ADataSet.Fields[i].OnSetText := Self.FieldSetText;
      end;
    end;
      

  4.   

    提示:Undeclared identifier:'fieldsettext'是什么原因呢?
      

  5.   

    没有声明FieldSetText,先声明,后实现方法。
      

  6.   

    在type下声明吗?
    声明过程的语句是怎么样呢?
      

  7.   

    如何忘記Enter(回車),數據不會post,因此要考慮用戶不回車的可能性
      

  8.   

    你要自定义一个procedure FieldSetText(Sender: TField; const Text: string);
    然后为他写代码
      

  9.   

    我已按你教的去操作:
    procedure FieldSetText(Sender: TField; const Text: string);
    begin
      ADOQuery1.Edit;
      ADOQuery1.FieldByName(Sender.FieldName).AsString := Text;
      ADOQuery1ata.Post;
    end;
    是不是还缺点什么?
    在type下面还要加procedure FieldSetText(Sender: TField);吗?
    这样会提示:Parameter lists differ
      

  10.   

    if ado.state in [dsInsert,dsEdit] then
      ado.Post;
    // 加个保存按钮
      

  11.   

    我太菜了,看了还是不明白。
    我想实现的功能是焦点不在cxgrid时,就保存。比如一个属性为checkbox的字段,我点选后即保存修改,而不需要其它确实。
        我在  onEditchanged事件中加入如下代码,问题解决了,但不知是否会有什么不良影响。procedure TCreateBarCodeF.cxGridDB_BarCodeEditChanged(
      Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
    begin
     if ADOQuery1.Active=true then
           ADOQuery1.Post;
    end;