> -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] On Behalf Of Virgil Frum > Sent: 06 October 2004 14:37 > To: [EMAIL PROTECTED] > 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(); ---------------------------(end of broadcast)--------------------------- TIP 4: Don't 'kill -9' the postmaster