我想删除我在TDBAdvGrid上显示的多条选定记录。通过选中前面的复选框选择了许多记录。单击“删除”按钮后,将触发以下过程。它成功返回所选行id的值只有删除所有记录的问题。它仅删除第一个选定的记录。
procedure TForm5.Button3Click(Sender: TObject);
var
i,j,idn: Integer;
State: Boolean;
begin
j := 0;
for i := 1 to DBAdvGrid1.RowCount - 1 do
begin
if DBAdvGrid1.GetCheckBoxState(1,i,state) then
begin
if state then
begin
idn := StrToInt(DBAdvGrid1.Cells[6,i]);
UniQuery1.SQL.Text := 'Delete from userplays where id = :id';
UniQuery1.ParamByName('id').AsInteger := idn;
UniQuery1.ExecSQL;
end;
end;
end;
end;
仅删除阵容中的第一条记录。删除第一个记录后,它会中断循环,并且控制在删除后返回到TDBAdvGrid,并显示更新的数据。
答案 0 :(得分:0)
基于建议的最终代码如下
j := 0;
DBAdvGrid1.BeginUpdate;
for i := 1 to DBAdvGrid1.RowCount - 1 do
begin
showmessage('inside rowcount loop');
if DBAdvGrid1.GetCheckBoxState(1,i,state) then
begin
if state then
begin
DBAdvGrid1.DataSource.DataSet.First;
DBAdvGrid1.DataSource.DataSet.MoveBy(i - 1 - j);
DBAdvGrid1.DataSource.DataSet.Delete;
j := j+1;
continue;
end;
end;
end;
此代码仅在PageMode := False
答案 1 :(得分:0)
基于上述建议,我想提出另一个建议......
//DBAdvGrid1.BeginUpdate;
query.First;
for i := 1 to DBAdvGrid1.RowCount - 1 do
begin
if DBAdvGrid1.GetCheckBoxState(1,i,state) then
begin
if state then
begin
//you can do whatever you want with the current selected record
end;
end;
query.Next;
end;
我认为这比使用MoveBy更容易...... 我甚至从未改变过PageMode,它仍然是真的。不知道它是否巧合。
答案 2 :(得分:0)
您可以在OnCheck事件中使用带有虚拟表的cyBookmarks。 它会创建所选记录的列表,您可以将其列出 cyBookmarks.bookmarklits.count,所以我的例子是这样的:
procedure TForm2.cyDBGrid1CheckBoxClick(Sender: TObject);
begin
if cyBookmarks1.AddCurrentRecord then
begin
cyBookmarks1.BookmarkList.InsertBookmark(cyDBGrid1.CheckedList.CurrentRecord);
cyDBGrid1.Invalidate ;
end
else
begin
cyBookmarks1.RemoveCurrentRecord;
cyDBGrid1.Invalidate;
end;
if cyBookmarks1.BookmarkList.Count>0 then
begin
VirtualTable1.GotoBookmark(cyBookmarks1.BookmarkList.Items[0]);
lbl1.Caption:=VirtualTable1.FieldByName('N_ENREGISTREMENT').AsString;
end;
end;