对一个外部程序的dbgrid取得控件后DataSet := TDBGrid(vWinControl.Components[I]).DataSource.DataSet;
 
用了以下的句子,并给表单填上了一行值, 完成后,不管是用post, 还是把指针next或者last,,, 表单都一直处在 "插入" 状态, 请问如何结束这个插入状态, 以便再添加一行新的?
想过用DBNaVigator组建里的按键来控制, 但如果不需要用到时最好的了,因为有时候要插入的记录很多, 那是不是会导致控制键一闪一闪的....
新手,搜了很久不得要领,万望前辈指导. 谢谢!DataSet.Active:=True;
DataSet.DisableControls;
DataSet.Append;
DataSet.Fields[0].AsString := '测试1';
DataSet.Fields[1].AsString := '测试2';
DataSet.Fields[2].AsString := '测试3';
DataSet.Fields[3].AsString := '测试4';DataSet.Post;
DataSet.Next;
 

解决方案 »

  1.   

    DataSet.Active:=True;
    DataSet.DisableControls;
    DataSet.Append;
    DataSet.edit;  //应该加上这行
    DataSet.Fields[0].AsString := '测试1';
    DataSet.Fields[1].AsString := '测试2';
    DataSet.Fields[2].AsString := '测试3';
    DataSet.Fields[3].AsString := '测试4';DataSet.Post;
    DataSet.Next;
      

  2.   


    试过的, 结尾的post 一样不起作用, 为了插入行, 我有试过Append 和 Edit, 随便用上一个, 都可以成功的插入一行并赋值.  
    我要做的是连续插入n行后, 才按DBNaVigator组件里的打钩按钮生效, 插入一行结束后, 如果还保持在插入状态, 插入下一行的命令就会出错, 所以我认为应该在插入一行后, 就把状态变成Browse, 然后再循环插入下一行, 不知道是不是这么个情况
      

  3.   

    DataSet.DisableControls和DataSet.Next去掉,后面要是有DataSet.EnbleControls也去掉就这样即可
    append;
    ...
    post;
      

  4.   

    DataSet.Active:=True;
    DataSet.DisableControls;//这句在这里没有意义,删除即可是这个导致的
    DataSet.Append;
    DataSet.Fields[0].AsString := '测试1';
    DataSet.Fields[1].AsString := '测试2';
    DataSet.Fields[2].AsString := '测试3';
    DataSet.Fields[3].AsString := '测试4';DataSet.Post;
    DataSet.Next;
      

  5.   

    DataSet.DisableControls;//使DBGRID失去对DataSet改变的响应,所以你在DataSet做的更改并没在DBGRID中显示出来
      

  6.   

    1、去掉DataSet.DisableControls
    2、Next,如果不是循环,这里不用。循环的话把Active放在外面
    3、如果用DataSet.DisableControls,记得要DataSet.EnableControls,同时用try finally包起来,确定能够EnableControls
      

  7.   

    disablecontrols,后面却没有enablecontrols。一楼的,别瞎说
      

  8.   


    DataSet := TDBGrid(vWinControl.Components[I]).DataSource.DataSet;//取得组件DataSet.Append; //第一条记录
    DataSet.Fields[0].AsString := '测试1';
    DataSet.Post;DataSet.Append; //第一条记录
    DataSet.Fields[0].AsString := 'test2';
    DataSet.Post;以上减化代码,先不循环, 直接输入2条记录的代码来测试 
    此情况运行的情况是, 表单里出现2行记录, 但2行的输入的值都是第一条的值 "测试1", 指针在第一行, 状态为"插入", 并且此时已经无法用TMyNavgator的打钩生效按钮, 提示"关键栏目值重复"
    其中第一条记录之后, 加不加next, last, 都是同上结果.
    或者我在第一条记录之后, 控制Navgator的点击效果, 不管是nbInsert, 还是nbPost,也是同上结果.
    TMyNavgator(vWinControl.Components[15]).Buttons[nbPost].Click;
    TMyNavgator(vWinControl.Components[15]).Buttons[nbInsert].Click;6楼:
    测试代码如下, 也跟上面几种方法都用了, 结果一样.  不够怎么样的语句, 结果只有一个, 就是, 增加了2条相同记录,指针在第一条,插入状态,无法提交生效,提示"关键栏值重复".DataSet := TDBGrid(vWinControl.Components[I]).DataSource.DataSet;//取得组件DataSet.Active := True;
    try
    DataSet.DisableControls;
    DataSet.Append; //第一条记录
    DataSet.Fields[0].AsString := '测试1';
    DataSet.Post;DataSet.Append; //第一条记录
    DataSet.Fields[0].AsString := 'test2';
    DataSet.Post;finally
    DataSet.EnableControls;
    end;
    是不是有什么属性方法, 还没有尝试的, 继续求解.
    谢谢!
      

  9.   

    经过不断尝试, 现在总算可以用TMyNavgator(vWinControl.Components[15]).Buttons[nbInsert].Click;
    间接增加记录了, 但是速度那个慢啊我发现在测试的每增加一条记录的时候, 当前记录号的值都是固定的-1, 而 浏览状态下,当前记录号值是正常的. 
    ShowMessage(IntToStr(DataSet.RecNo)); // 外部表单这个的记录号值, 都固定不变莫非就是新增时候,当前记录号没有变化, 导致append或insert不能用?
    请问有什么解决办法, 否则用DBNavgator控制的新增,速度实在不行
      

  10.   

    1、你用append两次,当然会保存两条记录,而且数据库中显示的也是正确的,第一条在下面,后面新增的在上面,指针指向当前新增的记录。新增的话,指针新增指向新增的记录。这里不用next或last。next是循环时用,于指向下一条记录,last是指向数据集的最后一条记录。
    2、TMyNavgator只是一个工具,你完全可以自己在代码写
    比如:
      点击新增按钮:
         dataSet.append;
        dataSet.Fields[0].astring := 'value1';
        dataSet.Fields[1].astring := 'value2';
        dataSet.Post;
      删除:
         dataSet.Delete;
      下一条: 
         dataSet.next; //可以判断下,是否为eof和bof
      上一条:
         dataSet.prior;等等
      
    post后数据集的状态为browser,你自己可以跟踪一下,post后,哪里吧状态修改成“Insert”状态?
      

  11.   

    jonathanscor没太仔细看我的问题呢, 我用了2此append,固然会出现2条记录, 可是却是2条一模一样的记录, 然后就是无法保存, 而我的每个append之后, 都用了post, 可就是这个post不起作用, 导致第2条记录一直处于插入状态, 然后就是无法插入第3条了, 一般表现为程序直接关闭了. 而目前只能用模拟按键的方法 TMyNavgator, 来插入第3条 第4条...., 可是这速度实在是慢, 组件上的 "+" 号什么的,闪个不停.
    如果dbgrid是自己的程序上的, 我想post应该是没什么问题, 可现在是在外部程序里面的, 用了post死活不起作用,  就是我只测试加入一条记录, 然后post,  也是无法离开"插入"状态.所以我要解决的问题就是, 如何在一个外部dbgrid上, 连续的插入n行记录?  我猜在每行记录之间不能使连续的保持"插入"状态, 必须有个状态切换( "插入" -> 赋值n行 -> "浏览" -> "插入" -> 赋值n+1行)
    而这个问题现在的关键是, 赋值后,post不起作用
      

  12.   

    你自己设下断点,输出dataSet.State,插入状态是不需要状态的切换,grid会自己完成。你看下grid的afterscoll、beforePost等事件是不是写了什么,有按条件执行cancal或其他的操作,自己单步测试一下吧,这个问题不复杂的
      

  13.   

    插入状态不结束, 是无法再插入新记录的, 但是奇怪的是, append第1条记录正常,append第2条也正常,此时,第1条记录就生效了, 第2条的状态是"插入", 到此我得到的以下3种记录的值TFakeGrid(vWinControl.Components[I]).Row) //值2
    abs(DataSet.RecNo)                        //值1
    DataSet.RecNo                             //值-1然后再append第3条时候,程序自动关闭,
    或者直接在append第3条之前加个post, 以上3个记录的值都变成了 1
    而且,原本插入的2条记录,变成了一模一样的, 也就是说第2条记录跟第1条记录一模一样了. post之后无法打钩生效了,提示 "关键栏目值重复", 更不用说加append了
      

  14.   

    所以 在第2个append后,加post,不能说没起作用, 但却不知道起了个啥作用, 把第2行记录给覆盖成第一条记录了, 而且还把第1条记录当成了当前行 (不加post的时候, 第2行记录是当前行)
      

  15.   

    有主键的情况下,append或insert多条记录之后没有requery刷新记录时,如果有多条相同的记录,再修改就会产生各种各样的错误。我一般都采用代码添加,添加后刷新,再设置当前记录为编辑状态。
      

  16.   

    你好,可以详细说说嘛, 我的情况是添加了不相同的几条记录, 产生相同记录是在post之后, 也就是post造成的, 最后一条记录跟第一条记录一模一样, 或许就是DataSet.RecNo没有跟着递增, 导致post后覆盖了第2条记录?
    我用过dataset.Refresh, 一运行含dbgrid的程序就关闭了.