本帖最后由 jonathanbear 于 2012-02-07 10:53:34 编辑

解决方案 »

  1.   

    这里我补充一下:我看了一下内存表的recordcount,虽然只输入了一行数据,另一行为空,即使在BeforePost中调用Cancel后,仍然为2,我的保存机制有几种,如果改为dmall,就是整表更新的话,这时数据库中就保存2条同样的记录了。但是明明我只输入一条,另一条是空的,我就不明白另一条记录的内容是怎么来的。这个也太奇怪了
      

  2.   

    BeforePost是保存至服务器,你看到的是内存表,虽然你没有保存到服务器,但你也未删除内存表的记录,也未将内存表与服务器的requery一下。所以你的内存表中仍是2条记录。
    内存表中的数据和服务器中的数据是相对独立的,除非你执行了更改命令,它会将改动保存至服务器,虽然你上面的处理,不让它保存到服务器,但这并不影响内存表中的数据。
      

  3.   

    我的这个BeforePost是DateSet中写的,这个是服务器的保存吗?一般Dbgrid换行的时候就会有一个Post的过程吧?这时dbgrid中输入的数据就会Post到内存表的。我跟踪了一下代码,在换行的时候也会有BeforePost的呀,我的后台是另外一个提交保存的过程,现在的内存表只是做为一个保存输入数据的控件。如果说控制的话,不知道有好的方法没?
      

  4.   

    Self.MemTableEh1.ApplyUpdates()不是dbgrid换行会产生post动作,是表的记录移动会产生post动作也就是afterstroll。
    如果是只是显示用内存表,如果是编辑不要用内存表,还会产生很多问题如:新增记录主键的问题等等。
      

  5.   

    对的,内存表的主键我会从服务器里做回写的动作
    MemTableEh1.ApplyUpdates(0);
    WriteBackID(MemTableEh1);//回写ID
    就是上面出的问题有点想不通,看来只能保存后,重新从数据库重读一遍。我就是像如果是其他的数据元件,保存时,当你换行后,保存时,会退回到上一行,这步操作是怎么实现的,有什么好的方法吗?感谢你的回复
      

  6.   

    我就是像如果是其他的数据元件,保存时,当你换行后,保存时,会退回到上一行,这步操作是怎么实现的,有什么好的方法吗?
    这个还是不要改的好,你可以增两个按扭(保存、取消,这两个按扭的enabled:=(MemTableEh1.State in [dsEdit, dsInsert]),初始为false,这样只要数据被改动,它俩就会显示),如果只是单一的需要保存时,按下这两个即可,如果是想保存并移动至下一行,就会自动保存。