对一个外部程序的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;
用了以下的句子,并给表单填上了一行值, 完成后,不管是用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;
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;
试过的, 结尾的post 一样不起作用, 为了插入行, 我有试过Append 和 Edit, 随便用上一个, 都可以成功的插入一行并赋值.
我要做的是连续插入n行后, 才按DBNaVigator组件里的打钩按钮生效, 插入一行结束后, 如果还保持在插入状态, 插入下一行的命令就会出错, 所以我认为应该在插入一行后, 就把状态变成Browse, 然后再循环插入下一行, 不知道是不是这么个情况
append;
...
post;
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;
2、Next,如果不是循环,这里不用。循环的话把Active放在外面
3、如果用DataSet.DisableControls,记得要DataSet.EnableControls,同时用try finally包起来,确定能够EnableControls
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;
是不是有什么属性方法, 还没有尝试的, 继续求解.
谢谢!
间接增加记录了, 但是速度那个慢啊我发现在测试的每增加一条记录的时候, 当前记录号的值都是固定的-1, 而 浏览状态下,当前记录号值是正常的.
ShowMessage(IntToStr(DataSet.RecNo)); // 外部表单这个的记录号值, 都固定不变莫非就是新增时候,当前记录号没有变化, 导致append或insert不能用?
请问有什么解决办法, 否则用DBNavgator控制的新增,速度实在不行
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”状态?
如果dbgrid是自己的程序上的, 我想post应该是没什么问题, 可现在是在外部程序里面的, 用了post死活不起作用, 就是我只测试加入一条记录, 然后post, 也是无法离开"插入"状态.所以我要解决的问题就是, 如何在一个外部dbgrid上, 连续的插入n行记录? 我猜在每行记录之间不能使连续的保持"插入"状态, 必须有个状态切换( "插入" -> 赋值n行 -> "浏览" -> "插入" -> 赋值n+1行)
而这个问题现在的关键是, 赋值后,post不起作用
abs(DataSet.RecNo) //值1
DataSet.RecNo //值-1然后再append第3条时候,程序自动关闭,
或者直接在append第3条之前加个post, 以上3个记录的值都变成了 1
而且,原本插入的2条记录,变成了一模一样的, 也就是说第2条记录跟第1条记录一模一样了. post之后无法打钩生效了,提示 "关键栏目值重复", 更不用说加append了
我用过dataset.Refresh, 一运行含dbgrid的程序就关闭了.