微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

退出正在编辑的单元格时如何立即在 TDBgrid 中发布数据

如何解决退出正在编辑的单元格时如何立即在 TDBgrid 中发布数据

我在 MysqL 数据库中有一个 TDBGrid --> Tdatasource --> TQuery --> 表。

网格/查询中的一个字段是布尔值并显示为复选框。

我已经编写了代码,可以按照我在 SO 上按照标准答案单击的任何列标题对网格进行排序。

我有一个“保存”按钮,可以执行相当多的无关处理,但它做的第一件事是

MyQuery1.edit;
MyQuery1.Post;

确保发布最后一次编辑,即使用户在点击“保存”之前没有移动到另一行。

问题。

例如,如果我勾选一个复选框以将字段值从 FALSE 更改为 TRUE 并移动到不同的,则数据将根据需要回发到表中,并且该行保持勾选状态滚动

如果我勾选一个复选框并点击“保存”按钮,则该按钮中的代码会发布,并且该复选框保持选中状态

但是,如果我勾选一个复选框并移动到另一列的列标题以对网格进行排序,则不会发布数据,并且在排序完成后,复选框未选中>

问题

是否有一些事件可以用于在我立即勾选(或取消勾选)复选框或退出复选框所在的列时进行发布。

我的尝试

我已经尝试了 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;

在进行排序的代码的开头。

但我还是想知道是否有更好的方式在离开牢房时发帖。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。