안녕하세요? 이중락 입니다.
DBGrid에서 MultiSelect된 행을 삭제하려 하는데 잘 안되네요.
어쩔때는 선택한 마지막행만 안지워지고 어쩔때는 몇개만 선택했는데도 모든 레코드를 삭제해 버립니다. T.T
델코와 여기의 Q&A란을 아무리 뒤져도 안나오고....
아래는 제대로 잘 안되는 소스 입니다.
한수 부탁드리겠습니다.
==================================================================================
if MessageDlg('선택된 모든 레코드를 삭제하시겠습니까?', mtWarning, [mbOk, mbCancel], 0) = mrOk then begin
with DBGrid1 do begin
DataSource.DataSet.DisableControls;
if SelectedRows.Count > 0 then begin
For i:=0 to SelectedRows.Count-1 do
if SelectedRows.Indexof(SelectedRows.Items[i]) > -1 then
DataSource.DataSet.Delete;
end;
DataSource.DataSet.EnableControls;
Query1.Active := False;
Query1.Active := True;
end;
end;
> 안녕하세요? 이중락 입니다.
> DBGrid에서 MultiSelect된 행을 삭제하려 하는데 잘 안되네요.
> 어쩔때는 선택한 마지막행만 안지워지고 어쩔때는 몇개만 선택했는데도 모든 레코드를 삭제해 버립니다. T.T
> 델코와 여기의 Q&A란을 아무리 뒤져도 안나오고....
> 아래는 제대로 잘 안되는 소스 입니다.
> 한수 부탁드리겠습니다.
> ==================================================================================
>
> if MessageDlg('선택된 모든 레코드를 삭제하시겠습니까?', mtWarning, [mbOk, mbCancel], 0) = mrOk then begin
> with DBGrid1 do begin
> DataSource.DataSet.DisableControls;
> if SelectedRows.Count > 0 then begin
> For i:=0 to SelectedRows.Count-1 do
> if SelectedRows.Indexof(SelectedRows.Items[i]) > -1 then
> DataSource.DataSet.Delete;
> end;
> DataSource.DataSet.EnableControls;
> Query1.Active := False;
> Query1.Active := True;
> end;
> end;
>
DBGrid에서 선태한 레코드를 가리키는 SelectedRows는 문자열 String의
집합이다. 그런데 이문자열은 특수문자열로 Pointer형을 문자화
시킨겁니다.
이정도면 단번에 DataSet의 GetBookmark난 GotoBookmark가 생각이
나시는 분이 있을겁니다.
여기서 DataSet의 GotoBookmark를 사용합니다.
with self.dbgrdMain, self.qryMain do
begin
try DisabldControls
for iCount := SelectedRows.Count-1 downto 0 to
begin
GotoBookmark(Pointer(SelecteRows.Items[iCount]));
Delete;
end;
finally
EnableControls;
end;
end;
이렇게 하면 될것니다. List에 대한 삭제는 꼭 downto를
사용하셔야 합니다. 레코드를 삭제하면 BookMark도 없어지기
때문에 Up Count로 하면 Access 어쩌고저쩌고 할것니다.
뭔가 이상하면 Mail 주세요...