DBGrid的多行选择问题?(100分)

  • 主题发起人 主题发起人 HLHGOD
  • 开始时间 开始时间
H

HLHGOD

Unregistered / Unconfirmed
GUEST, unregistred user!
我正在编一个数据交换的小程序,我要在DBGrid中实现多行选择的数据导出到另外一个数据表中,
但不知为什么,总是会少导出最后选择的那条记录,举例说,我在dbgrid中选择了五行,导出后,只有四行
请各位高手拉一把.
Bookmarklist:=dbgrid1.selectedrow
for i:=0 to Bookmarklist.Count-1 do
begin
DBGrid1.DataSource.DataSet.Bookmark:=BookmarkList.Items;
Datamodule1.ADOTable2.InsertRecord([Datamodule1.ADOTable1.fields[0].value,Datamodule1.ADOTable1.fields[1].value,
Datamodule1.ADOTable1.fields[2].value]);
end;


另外,用鼠标右键弹出右键菜单后会把原先用(Ctrl+左键)选择好的多行数据取消掉,有没有好的办法
不让选择取消.
 

Bookmarklist:=dbgrid1.selectedrow
for i:=0 to Bookmarklist.Count do // 這里改一下看看
begin
DBGrid1.DataSource.DataSet.Bookmark:=BookmarkList.Items;
Datamodule1.ADOTable2.InsertRecord([Datamodule1.ADOTable1.fields[0].value,Datamodule1.ADOTable1.fields[1].value,
Datamodule1.ADOTable1.fields[2].value]);
end;
 
应该不是这样吧
 
不行,会提示超出范围之类的对话框.请各位继续帮助.
 
if dbgrid1.selectedrow>0 then
begin
for i:=0 to DBGrid1.SelectedRows.Count-1 do
begin
GotoBookmark(pointer(DBGrid1.SelectedRows.Items));
Datamodule1.ADOTable2.InsertRecord([Datamodule1.ADOTable1.fields[0].value,Datamodule1.ADOTable1.fields[1].value,
Datamodule1.ADOTable1.fields[2].value]);
end;
end;
 
我看他们都是把表导入到listview,然后里面与check属性,然后用于选择
 
Weekboy的方法还是不行啊,还是少一条,会不会是在DBGird中选择中有错,多选的时候,最后一
条记录前面的标志和其它的不一样,是·>,而其它的是·,但是多选删除时又全部可以删,不会
出现最后一条遗漏的情况.
 
看看TDataSet.GotoBookmark帮助,写得很清楚。
insert完了了以后,refresh一下看有没有效果.
 
if DbGrid1.SelectedRows.Count>0 then
begin
with DbGrid1.DataSource do
begin
Bk := DataSet.Bookmark;
//DataSet是DbGrid1.DataSource指向的数据集
DataSet.DisableControls;
DataSet.First;
while not DataSet.Eof do
begin
if DbGrid1.SelectedRows.CurrentRowSelected then
begin
DataSet.Delete;
end
else
begin
DataSet.Next;
end;
end;
DataSet.EnableControls;
DataSet.Bookmark := Bk;
end;
end
 
兄弟,下面的程序是大侠王寒松的一段程序,我试过了,可以的
var
i:integer;
x: word;
TempBookmark: TBookMark;
begin
i:=0;
DBGrid1.Datasource.Dataset.DisableControls;
while i<=dbgrid1.SelectedRows.Count-1 do
begin
DBGrid1.Datasource.Dataset.Bookmark:= dbgrid1.SelectedRows.Items;
TempBookmark:= DBGrid1.Datasource.Dataset.GetBookmark;
DBGrid1.Datasource.Dataset.GotoBookmark(TempBookmark);
// 现在DBGRID1连接的数据集指到了一条选择的记录,可以进行操作了
// 比如 DbGrid1.DataSource.DataSet.FieldByName('record1').AsString...

end;
DBGrid1.Datasource.Dataset.FreeBookmark(TempBookmark); //释放临时BOOKMARK
DBGrid1.Datasource.Dataset.EnableControls;
End;

 
程序没有问题,问题是你确实是少选了一行。你可以在选择的同时用个label来显示你的选择的行的某个字段的值。
是DBGrid中Option的设置有问题。当你并没有选中第一行(或是最后一行时),显示的是那个选中的标志。

我遇到过这个问题,具体是哪个设置,忘了。

或者显示一下dbgrid1.SelectedRows.Count,就可以了。
 
Options = [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgConfirmDelete, dgCancelOnExit, dgMultiSelect]

这是我的设置,如果和你的一样,那就是怪事了!
 
问题解决了,多谢各位的帮助,我看关键还是要善于利用调试工具,瓜分吧.
 
后退
顶部