簡體   English   中英

退出正在編輯的單元格時如何在 TDBgrid 中立即發布數據

[英]How to post data in TDBgrid immediately when exiting the cell being edited

我在 MySQL 數據庫中有一個 TDBGrid --> Tdatasource --> TQuery --> 表。

網格/查詢中的一個字段是 Boolean 並顯示為復選框。

我已經編寫了代碼來按我單擊的任何列標題對網格進行排序,遵循 SO 上的標准答案。

我有一個“保存”按鈕,它執行相當多的無關處理,但它做的第一件事是

MyQuery1.edit;
MyQuery1.Post;

確保發布最后一次編輯,即使用戶在單擊“保存”之前沒有移動到另一行。

問題。

例如,如果我勾選一個復選框以將字段值從 FALSE 更改為 TRUE 並移動到另一,則數據會根據需要回發到表中,並且當我滾動時該行保持勾選狀態

如果我勾選一個復選框並移動以單擊“保存”按鈕,則該按鈕中的代碼會發布一個帖子並且該復選框仍處於選中狀態

但是,如果我勾選一個復選框並移動到另一列的 header 列以對網格進行排序,則不會發布數據,並且在排序完成后復選框未選中

問題

是否有一些事件可以用來發布帖子,或者我立即勾選(或取消勾選)復選框,或者當我退出復選框所在的列時。

我試過的

我已經嘗試了 DBgrid 的以下事件,但是當我離開單擊列標題時似乎沒有被調用

OnEditChange() 
OnEditRecord(()
OnColExit(()

如果有人想在“保存”按鈕中查看我的“不相關處理”的完整代碼,那就是這個,但正如我所說,它是不相關的。

procedure TFrmBulkSubdPaymentRecord.btnSaveClick(Sender: TObject);
var
  i : Integer;
  member_id_making_payment : Integer;
  invoice_id : Integer;
  cash_payment_ref : string;
  payment_amount : Currency;
  paid_date : TDateTime;
  user_comment : string;
  sql : string;
  NunRecordSaved : integer;
  SQL_of_changes : string;
begin
    SQL_of_changes := '';
    user_comment := 'Bulk insertion on ' + ReverseDateString(DateToStr(Date));
    paid_date := Date;
    NunRecordSaved := 0;
     SMDBGrid1.DisableScroll;

     MyQuery1.DisableControls;   //to avoid dataset not in edit mode error see https://forums.devart.com/viewtopic.php?t=25580
     MyQuery1.edit;
     MyQuery1.Post;// make sure that even one row gets put in even if we don't move cursor off it
     MyQuery1.EnableControls ;

    MyQuery1.First ;
    while not MyQuery1.eof do   // if this row is ckecked, build up the paramenters and mark this invoice as paid
        begin
        if MyQuery1.FieldByName('payment_made').AsBoolean = true then
          begin
            member_id_making_payment := MyQuery1.FieldByName('member_id').asInteger;
            invoice_id  := MyQuery1.FieldByName('invoice_id').asInteger;
            cash_payment_ref  := MyQuery1.FieldByName('invoice_ref').asString;
            payment_amount  := MyQuery1.FieldByName('invoice_amount').AsCurrency ;
            sql :=  'CALL record_new_payment('
                   + ToSQL.Int(member_id_making_payment) + ','
                   + ToSQL.Int(invoice_id) + ','
                   + ToSQL.MySQLText(cash_payment_ref) + ','
                   + ToSQL.Float(payment_amount) +','
                   + ToSQL.Date(paid_date) +','
                   + ToSQL.MySQLText(user_comment) +');'  ;
            DMod.RunSQLCommand(sql);
            inc(NunRecordSaved);

            SQL_of_changes :=  SQL_of_changes +
              U_SQLcode.SQL_ChangeMade(
                                       member_id_making_payment,   //AffectedMemberID   integer
                                       'New payment',        //ChangeType
                                       'Member: '+ inttostr(member_id_making_payment) + 'Invoice: ' + inttostr(invoice_id),                       //FieldChanged
                                       '',                                //OldData
                                       '£'  + CurrToStr(payment_amount) ,    //Newdata
                                       user_comment,             //Comment
                                       invoice_id   //invoiceID integer
                                       );
            end;
        MyQuery1.Next;
        end;
     SMDBGrid1.EnableScroll;
 if NunRecordSaved > 0  then
    begin
    DMod.RunSQLCommand(SQL_of_changes);
    ShowMessage(IntToStr(NunRecordSaved)+' payments for full subs amount saved' );
    LoadGrid(TheFeeYear);
    end
 else
    ShowMessage('No members ticked as having paid, nothng saved')
end;

我通過添加解決了這個問題

MyQuery1.edit;
MyQuery1.Post;

在進行排序的代碼的開頭。

但我仍然想知道在離開牢房時是否有更好的發帖方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM