我用adotable做数据集,用dbgrid显示。adotable的lock type设为ltBatchOptimistic。在新增记录的事件里我加了一些预设字段值的语句,如设置fields[0].value := 1之类的,但是记录并没有真正提交到数据库里去。现在我想在新增记录按下后,dbgrid便新增一行,当我点击上面的任意一条记录时,dbgrid新增的一行能自动删掉。如何实现?
如果用dbnavigator控制的话,就有这样的功能。新增一行如果没有输入数据而点击别的行时,最后一行会自动删掉。  

解决方案 »

  1.   

    大富翁上的一个朋友这样回答:
    YourTable.Insert;
    ....(Initialize code)
    并记录下你的record number.
    然后找Table的AfterScroll事件,如果记录是从新增记录scroll过来的,那么就Yourtable.Cancle之。否则post.
    现在adotable的lock type方式为ltbatchoptimistic,按下新增按钮时表记录的个数不会增加的(除非updatebatch),那么我如何判断记录是从新增记录scroll过来的呢?
      

  2.   

    在Table的BeforeScroll事件中写如下代码
    if Table.State in [dsInsert] then
    begin
      Table.Cancel;
    end;
      

  3.   

    ltbatchoptimistic是利用的缓存的机制的 不会直接提交到数据库的
    需要updatebatch才可以更新的 或者你的locktype 属性使用默认的设置 post的话就可以直接的提交了
      

  4.   

    至于删除的事件 你可以在dbgrid的onclick事件中处理 直接delete就可以了
      

  5.   

    TO xhai(小小):你的代码是行不通的。因为state = dsBrowse.
    To angle097113:locktype使用默认属性的话,就好办多了,我现在的lock type属性就是要设成ltbatchoptimistic。
      

  6.   

    你在ADOQuery1.OnNewRecord 事件里放给预设字段赋值的语句就可以了。在那里直接赋值,不需要用ADOQuery1.Insert , ADOQuery1.Edit这类语句。
      

  7.   

    在数据源的afterscroll事件中写上dbgrid.refresh