0

我想删除在 TDBAdvGrid 中显示的多个选定记录。通过选中它们前面的复选框来选择许多记录。单击删除按钮后,它会触发如下过程。它成功返回所选行的值,只有删除所有记录的问题。它只删除第一个选定的记录。

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;

它只删除阵容中的第一条记录。删除第一条记录后,它会中断 for 循环,并且在删除后控制返回到 TDBAdvGrid 并更新数据。

在此处输入图像描述

4

3 回答 3

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

于 2013-10-17T07:19:45.637 回答
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,它仍然是正确的。不知道是不是巧合。

于 2014-05-22T08:29:25.583 回答
0

您可以在 OnCheck 事件中使用 cyBookmarks 和 Virtual Table。它会创建所有选定记录的列表,您可以使用 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;
于 2015-12-10T12:44:44.827 回答