写了一个小程序。按“编辑”按钮后可以编辑dbgrid中的数据,dbgrid中的需要换算的其它数据也会随着编辑而及时的改变。然后,按下“取消”后我想恢复到以前的数据状态。
  但我的程序现在不能实现。谁懂请赐教。谢谢!!!

解决方案 »

  1.   

    “编辑”按钮click事件如下:
    procedure TdfForm.sb_editClick(Sender: TObject);
    var i:integer;
    begin
       dm.df.Edit;
       dm.df.Open;
       dm.xswh.Open;
       dbgrid1.ReadOnly:=false;
       sb_save.Enabled:=true;
       sb_cancel.Enabled:=true;
       sb_edit.Enabled:=false;
    end;
    “取消”按钮click事件如下:
    procedure TdfinforForm.sb_cancelClick(Sender: TObject);
    begin
       dm.df.Cancel;
      
       dbgrid2.ReadOnly:=true;
       dbgrid1.ReadOnly:=true;
       sb_save.Enabled :=false;
       sb_cancel.Enabled :=false;
       sb_edit.Enabled :=true;
      end;
      

  2.   

    首先,数据需要支持事务
    其次,数据源采用支持事务的数据源连接器具备上述前提条件后,在编辑之前打开事务,比如调用StartTransaction之类的方法,进入事务状态,然后进行编辑,取消时调用RollbackTransaction类似的方法,如果确定无误,则调用如CommitTransaction之类的方法提交。
      

  3.   

    开始事务StartTransaction
    回滚事务(取消操作):RollbackTransaction
    提交事务:CommitTransaction
      

  4.   

    3楼的应该可以,但dbgrid中的数据做不到你需要的实时,需要再刷新才可以.
    其实你说的这种效果不一定要事物,一般的数据集应该可以实现你的要求,
    比如:需要换算的其它数据你可以做成一个计算字段,如果需要存储你可以作成一个data型字段,
    在编辑你需要的数据后,然后计算后把值赋给那个字段即可.
    如果全部取消,数据集.cancel 就可以,
    如果提交,数据集.post(或数据集.update)举个例子: 
    如果你用的是AdoDataSet控件,把LockType属性设置为ltOptimistic,也就是批量提交数据保存.
      取消:ADODataSet1.CancelUpdates;
      提交:ADODataSet1.UpdateBatch(arall);
    如有其他需要换算的字段,且是计算字段类型的话,在 ADODataSet1的 oncalcFields事件中编写换算代码.
    如果不是计算字段并且也需要换算的话,可以在该字段的 Onchange 中编写代码如果还有问题,请继续讨论
      

  5.   

    很复杂的用dbgrid不好处理,特别是数据量大的时候。做好自己用操作,虽然一开始浪费时间,最后维护的时候可省力气