本帖最后由 wztimes 于 2012-03-29 21:49:52 编辑

解决方案 »

  1.   

    先查查字典Edit,Append,Post代表什么意思
      

  2.   

    意思我还是多少能猜出来的, 只是先append再edit, 然后赋值, 再post, 这个顺序我也是试过的, 结果就是帖子中那2个图片所示. 这只是加2行记录的结果, 加3行以上根本没法截图, 因为立刻这个外部dbgrid就关了.如果是自己的代码中的dbgrid, 我想应该不会有这问题, 但我是对外部dbgrid添加记录, 结果就这样了, 目前只能靠模拟按键DBNavigator上面的生效按钮来不断的添加下去, 可是那个速度太慢, 还一闪一闪的
      

  3.   

    其实他们的关系是
    Insert ->Post;
    append ->Post;
    edit ->Post;
    每个操作都和post对应的。
      

  4.   

    说点简单的,你要知道数据集在append、Insert、edit、post、Delete、cancel的操作是什么样的
    append:新增操作,数据集指针会指向数据集的最后一条,此时每个字段都能编辑、修改,但是还没有保存到数据集中,对应Post后,这条记录才算新增完成
    Insert和append概念上差不多,但是Insert插入就不是在最后一条,而是当前指针的前面插入一条新增的记录
    Edit:编辑指针指向的记录,同样也要Post,才算修改完成。你上面的Edit后append,这个当然没有作用,相当与edit没有任何值修改的操作
    像楼上说的append、Insert、edit要用post来结束当前的dsinsert或者dsedit状态,变为dsbrowser状态,第二条记录没有Post,那记录当然处于编辑状态
      

  5.   

    好像有点明白楼主的意思了,你的意思是append;... ;post;再次append;... ;post;赋值是不一样的,但是保存后两条记录一样?
      

  6.   

    对 就是这样, 我对一个空的dbgrid进行第1条append, 可以赋值, 然后即使没使用post, 也可以照样append第2条,并赋值, 问题来了, 接下来 不管是append, 还是post, 都不成. 其中post则会使指针跳到第一行,并且使得2行记录都变成第一条的. 如果是append, 则dbgrid程序直接关闭.后来我测试了已经保存好的几条记录, 然后post, 发现指针就是会跳到第一条, 当然这时候因为没有在编辑状态, 没法改变任何一条的值.  
    所以 大概是这个外部dbgrid用了beforpost,还是afterpost,还是beforeappend 什么的事件, 
    如果真是这样, 又该怎么解决呢?
    用DBNavigator工具条上的几个按钮, 都是没问题的.
      

  7.   


    楼主,一般的操作如上。   每操作完一次,就POST。   
      

  8.   

    DataSet.Append; //第一条记录
    DataSet.Fields[0].AsString := '测试1';
    DataSet.Fields[1].AsString := '测试1';
    DataSet.Fields[2].AsString := '测试1';
    DataSet.Post;  //加不加这代码, 都一样效果DataSet.Append; //第2条记录
    DataSet.Fields[0].AsString := 'test2';
    DataSet.Fields[1].AsString := 'test2';
    DataSet.Fields[2].AsString:='test2';
    //DataSet.Post;我就这这么写的啊, 问题是 最后这条post 就是会产生问题, 问题情形就是我在主贴上的图片所示的, 指针会跑到第一行, 本来输入的两行不同的内容, 结果被覆盖成一模一样的了
      

  9.   

    问题仍然是问题......
    我自己弄了个测试的dbgrid, 数据库连个access, 可以成功append -> 赋值 -> post -> 再append下一条, 测试了3条以上 都没问题, 这个测试dbgrid是插入一条,结束时候就保存到access里面的.
    而我最终的目标程序上的dbgrid, 是在输入了n条后,想真正存入数据库, 需通过一个入库按钮.这也说明我的对外部dbgrid赋值的程序代码, 是可以正常工作的(至少在我另外写的测试dbgrid上可以)
    猜想可能是由于目标程序的dbgrid上有些比如beforepost,还是afterpost等这样的事件作怪, 因为我做了个测试, 手工录入了几行记录后, 全部生效(还正式未存入数据库), 然后只给这个dbgrid发送了一条dataset.post代码, 结果 本来指针是在最底下一条记录的, 跑到了第一条. 当然由于所有已经录入的记录都是浏览状态, 所以值没得改变. 
    可是如果是我用代码赋值的话, append第2条然后赋值后, 由于第2条还在插入状态, 可以修改, 结果被第一条的值给覆盖了. 这接下来的代码就进行不下去了.请问这些情况, 是不是可以确定我的目标dbgrid存在着一些beforepost等等的事件, 我可以把这些事件都找出来吗, 再屏蔽掉?  
    如果不是这些事件作怪, 又是哪里的问题?
      

  10.   


    BeforePost := nil;
    //                    BeforeInsert := nil;
    BeforeDelete := nil;
    BeforeScroll := nil;
    BeforeRefresh := nil;
    BeforeOpen := nil;
    BeforeClose:= nil;
    BeforeEdit := nil;
    BeforeCancel:= nil;
    OnPostError := nil;
    OnCalcFields := nil;
    OnDeleteError:=nil;
    OnNewRecord:=nil;
    OnFilterRecord:=nil;
    OnEditError:=nil;AfterPost := nil;
    AfterInsert := nil;
    AfterDelete := nil;
    AfterScroll := nil;
    AfterRefresh := nil;
    AfterOpen:= nil;
    AfterClose := nil;
    AfterEdit:= nil;
    AfterCancel:= nil;把找得到的什么事件都屏蔽了, 还是没作用, 晕了
      

  11.   


    首先,dbgrid只是一个数据感知组件,append 是数据集的功能,你把2者弄混淆了。其次,数据集的工作方式就是:你说的(我自己弄了个测试的dbgrid, 数据库连个access, 可以成功append -> 赋值 -> post -> 再append下一条, 测试了3条以上 都没问题, 这个测试dbgrid是插入一条,结束时候就保存到access里面的.)
    不可能你append很多条以后,再一次性POST
      

  12.   

    谢谢, 一直在搜了, 现在就暂时用Navgator的按钮才实现好了, 慢是慢了点.
    我大概知道是用了缓存的方式, 然后再最后保存进数据的时候, 有一些beforepost等事件在起作用, 但是是外部程序的事件, 也不知道怎么弄. 先结了