> -----Original Message-----
> From: pgadmin-support-owner@postgresql.org
> [mailto:pgadmin-support-owner@postgresql.org] On Behalf Of Virgil Frum
> Sent: 06 October 2004 14:37
> To: pgadmin-support@postgresql.org
> Subject: Re: [pgadmin-support] Multiple selections delete bug
>
> The problem is just partially resolved. I've made some new
> tests (on oct 05
> release) and looked over changes you've made in
> src/ui/frmEditGrid.cpp.
> Conclusion: deletion is working correctly only if rows are
> selected in ascending or descending order with or without
> gaps. Selecting rows in an arbitrary order (ex. 7, 8, 9, 4,
> 5, 6) won't work.
>
> Method sqlTable::DeleteRows(size_t pos, size_t rows) is
> working correctly only on successively rows. So, I see 2
> possible solutions (with DeleteRows()
> unchanged):
> 1) order ascending 'delrows' array (wxArrayInt from
> frmEditGrid::OnDelete - line 498) and remove lines added in
> version 1.56
> 2) call sqlGrid->GetSelectedRows() after every
> sqlGrid->DeleteRows(delrows.Item(0), 1);
>
> I'm sorry for insistence, but I want to avoid deletion of wrong lines.
No problem - I committed a fix 5 minutes before your email implementing
your option 1!!
Regards, Dave
Index: frmEditGrid.cpp
===================================================================
RCS file: /projects/pgadmin3/src/ui/frmEditGrid.cpp,v
retrieving revision 1.56
retrieving revision 1.57
diff -Lsrc/ui/frmEditGrid.cpp -Lsrc/ui/frmEditGrid.cpp -u -w -r1.56
-r1.57
--- src/ui/frmEditGrid.cpp
+++ src/ui/frmEditGrid.cpp
@@ -488,6 +488,18 @@ if (optionsChanged) Go();}
+template < class T >
+int ArrayCmp(T *a, T *b)
+{
+ if (*a == *b)
+ return 0;
+
+ if (*a > *b)
+ return 1;
+ else
+ return -1;
+}
+void frmEditGrid::OnDelete(wxCommandEvent& event){ wxMessageDialog msg(this, _("Are you sure you wish to delete the
selected row(s)?"), _("Delete rows?"), wxYES_NO | wxICON_QUESTION);
@@ -498,22 +510,17 @@ wxArrayInt delrows=sqlGrid->GetSelectedRows(); int i=delrows.GetCount();
+ // Sort the grid so we always delete last->first, otherwise we
+ // could end up deleting anything because the array returned by
+ // GetSelectedRows is in the order that rows were selected by
+ // the user.
+ delrows.Sort(ArrayCmp);
+ // don't care a lot about optimizing here; doing it line by line // just as sqlTable::DeleteRows does
- if (delrows.Item(i-1) > delrows.Item(0))
- { while (i--) sqlGrid->DeleteRows(delrows.Item(i), 1);
- }
- else
- {
- int j = 0;
- while (j < i)
- {
- sqlGrid->DeleteRows(delrows.Item(j), 1);
- ++j;
- }
- }
+ sqlGrid->EndBatch();