2013-10-16 2 views
0

Je souhaite supprimer plusieurs enregistrements sélectionnés que j'ai affichés dans TDBAdvGrid. Un certain nombre d'enregistrements sont sélectionnés en cochant la case en face d'eux. Après avoir cliqué sur le bouton Supprimer, il déclenche la procédure comme suit. Il retourne les valeurs des lignes sélectionnées avec succès seulement problème avec la suppression de tous les enregistrements. Il supprime uniquement le premier enregistrement sélectionné.Comment supprimer les enregistrements sélectionnés de 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; 

Il supprime seulement le premier enregistrement de la gamme. Après la suppression du premier enregistrement, il est interrompu pour la boucle et le contrôle retourne à TDBAdvGrid avec les données mises à jour après la suppression.

enter image description here

+2

Supprimer directement sur la borne Dataset DBAdvGrid1.Datasource.Dataset. – bummi

+1

Avez-vous essayé 'DBAdvGrid1.SelectedRows.Delete'? – kobik

+0

@kobik 'DBAdvGrid1.SelectedRow' est là et c'est la propriété pas fonction/procédure. –

Répondre

0

code final basé sur la suggestion est la suivante

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; 

Ce code fonctionne parfaitement que lorsque PageMode := False

0

Basé sur la suggestion ci-dessus, je voudrais faire une autre suggestion ..

//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; 

Je pense que c'est plus facile que d'utiliser le MoveBy ... Je n'ai même jamais changé de PageMode, c'est toujours vrai. Aucune idée si c'est une coïncidence ou non.

0

Vous pouvez utiliser cyBookmarks dans l'événement OnCheck, avec Virtual Table. Il crée une liste de tous les enregistrements sélectionnés, et vous pouvez les énumérer avec cyBookmarks.bookmarklits.count, donc mon exemple est comme ceci:

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; 
+0

procédure TForm2.cyDBGrid1CheckBoxClick (expéditeur: TObject); commencer si cyBookmarks1.AddCurrentRecord puis commencer cyBookmarks1.BookmarkList.InsertBookmark (cyDBGrid1.CheckedList.CurrentRecord); cyDBGrid1.Invalider fin sinon début cyBookmarks1.RemoveCurrentRecord; cyDBGrid1.Invalidate; fin; si cyBookmarks1.BookmarkList.Count> 0, puis commencer VirtualTable1.GotoBookmark (cyBookmarks1.BookmarkList.Items [0]); lbl1.Caption: = VirtualTable1.FieldByName ('N_ENREGISTREMENT'). AsString; end; fin; – habib

Questions connexes