删除可多选DBGrid的行?——试了大家的几个方法,都不行啊 (100分)

A

Afei2

Unregistered / Unconfirmed
GUEST, unregistred user!
和数据库相连的DBGrid,直接在数据库上删除一行后系统自动滚到下一行,可以继续删除。
但是把DBGrid设置成可多选,删除选择的的多个行后,系统上就没有默认的被选择的行了,
这时候就不能继续删除,还要去点击某个行(将其变成选中状态),才可以继续删除。
我是这样删除选中的多行的:
procedure SpdBtnDeleteClick(Sender: TObject);
var
i:Integer;
begin
if 确认删除 then
begin
for i:=0 to DBGrid1.SelectedRows.Count-1 do
DBGrid1.SelectedRows.Delete;
end;
end;
因为我用DBGrid1.SelectedRows.Delete,所以要有选中才能被删除。
如果不用DBGrid1.SelectedRows.Delete的话,我发现系统是从最后一个被选中的开始删除
后面的N行,而不是我选中的N行。

所以我想问:
在DBGrid1.SelectedRows.Delete后,如何设置下一行为选中状态?
或者:
不用DBGrid1.SelectedRows.Delete(用DataSet.Delete),如何删除选中的DBGrid里的多个行?



 
试试把dbgrid中的options下的rowselect和alwaysshowselect设为true看
 
试了,不起作用。rowselect我本来就有设,alwaysshowselect可能只是在界面上有显示,
实际上并没有选中哪一行,也就是说DBGrid1.Select里面没有值,所以还是不能删除。

大家有兴趣的话,可以设置一下DBGrid的多选属性,可以看到选中的行和普通的行的显示
状态是不一样的(带有一个“>”)。
 
procedure SpdBtnDeleteClick(Sender: TObject);
var
i:Integer;
begin
if 确认删除 then
begin
for I:=BGrid1.Count downto 0 do
begin

DBGrid1.Datasource.Dataset.Bookmark:= Items;
DBGrid1.Datasource.Dataset.delete
end;
end;
 
To:雨人
你的程序是不是有几个地方漏了点东西?
我按着自己的理解改了一下,如下:
procedure SpdBtnDeleteClick(Sender: TObject);
var
i:Integer;
begin
if 确认删除 then
begin
for I:=BGrid1.SelectRowsCount-1 downto 0 do //应该是SelectRows的行数吧?
begin
DBGrid1.Datasource.Dataset.Bookmark:= DBGrid_ConLine.SelectedRows.Items; //应该是选中的那行的Item吧?
DBGrid1.Datasource.Dataset.delete
end;
end;

这样倒是在删除完选中的行后,不用点击进行选择而可以继续删除。可问题是,如果前一次
删除是选中了几行的话,下一次删除即使没多选,也是会被删除掉几行,可能是因为
SelectRows.Count的值还在起作用吧。你看呢?

 
SelectRows.Count并没有清除...
 
用(devexpress的)dxdbgrid 可以按Shift Ctrl 多选
 

for i:=0 to frm.DBGrid1.SelectedRows.Count-1 do

begin
GotoBookmark(pointer(frm.DBGrid1.SelectedRows.Items));
tabel1.delete ;
table1.post ;
end ;
 
我记得可以用移动数据库里面的记录的指针来确定当前所选定的记录
DBGrid1.DataSource.DateSet.First;
DBGrid1.DataSource.DateSetMoveBy(n);

 
难办,看来你只好模拟鼠标单击了,单击最左边的小按钮应该不难...
 
首先谢谢大家的回答。

To Carson_zzd:你的方法能删除,可是跟我前面说的一样,多选删除后,即使没再多选,
也还是会被删除前面选过的N行。可能又是Select.Count没被清除吧。
怎么清除掉Select.Count以及在哪里进行清除呢?

To yanghaijun:问题是你要告诉我怎么清楚啊。

To geluyx:我不是不能选,是选中后怎么删除,以及删除后面的问题。
 
grid.selectrows.clear; //去掉所有选择,清count为0
grid.SelectedRows.CurrentRowSelected:=False;//去掉当前行的选择
 

To kaithink:这样是把SelectedRows.Count 给清除了,可又回到了我最初遇到的问题:
删除选择的的多个行后,系统上就没有默认的被选择的行了,
这时候就不能继续删除,还要去点击某个行(将其变成选中状态),才可以继续删除。

我的需求是这样的:
如果有选中某行或某些行的话,删除选中的行;
如果没有选中的行,则删除当前显示的一行(应该也是数据库的当前行)。
 
没有默认的行????

1.如果你的当前是一个被选的行的话,那删除前移动它到一个不是被选的行,做2

2.如果当前行没有被选中的话,你可以定义一个bookmark变量,记下当前行
删除结束后重回那行记录
 
我用一个很简单的方法解决了:
procedure SpdBtnDeleteClick(Sender: TObject);
begin
if 确认删除 then
begin
if DBGrid_ConLine.SelectedRows.Count>0 then //有选中的行
DBGrid_ConLine.SelectedRows.Delete
else //没有选中的行
DBGrid_ConLine.DataSource.DataSet.Delete;
end;
end;

可让我不明白的是,在这里我也没有去清除系统中的SelectedRows.Count,怎么这样做就好了?
没有选中行的时候,SelectedRows.Count的值就是0,而前面怎么就一直会记住上次的值呢?
奇怪?不懂!
有谁能给解释一下?
 
See Help about TBookmark;
 
不知道你说什么
 
用Tbookmarklist类型的变量

var k:Tbookmarklist;
k:=dbgrid1.SelectedRows;
for i:=0 to k.count-1 do
table1.bookmark:=k.items[0];
table1.delete;
end;

直接在浏览器上写的不知有没有错误,反正就是这个道理


 
各位老大,是我说得不够清楚,你们没明白我的意思,还是我笨得不能理解你们说的内容?
是不是大家写在这里的程序都有些缺漏啊,我怎么用你们提供的方法一直都试不出来?

我的需求:
不管什么时候,当点击删除按钮时:
1——如果有选中的一行或N行,则删除选中的行;
2——如果没有选中的行,则删除当前的一行;
删除后有可能继续点击删除按钮,所以得考虑第二次(或更多次)删除的情况。
现在大家告诉我的,第一次删除都没问题,能按照设想进行;可第二次删除时,
有选中的行时也正常,没有选择行的情况就不行了(这时候SelectedRows.Count应该是空的吧?
可我跟踪时发现它总是有上一次的值):
如果没清除SelectedRows.Count,会删除掉N行;如果清除SelectedRows.Count,
则是一行都不删除,怎么都不是我要的“删除当前的一行”。

大家都告诉我用Bookmark,这东东不熟悉,去看帮助也没讲怎么用,
谢谢大家给我写了些提示代码,能不能完整点?


TO kaithink大虾:你分析的逻辑是对的,可我不知道怎样判断当前行(或一个行)
是不是一个被选中的行。怎么做的?
我是菜鸟,不好意思,:(
 
在删除选中的行后要继续选中其中的某一行,用DBGrid可能是做不到了...
除非你发送鼠标的点击消息...
 

Similar threads

S
回复
0
查看
642
SUNSTONE的Delphi笔记
S
S
回复
0
查看
651
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部