Есть некая таблица, отображаемая в DBgrid. Происходит некое действо, ну скажем удаление одной записи из этой таблицы. Делаем Refresh. Нужно вернуть курсор туда где был, с учетом того что позиции на которой он стоял уже может и не быть. Важно! В SQLQuery1 используются фильтры, поэтому SQLQuery1.recno и SQLQuery1.recordcount использовать нельзя.
//некий код
//некий код
//некий код
//здесь както запоминаем позицию
orgtehniks.SQLQuery1.Refresh;
//здесь позицию курсора должны поставить на место. Причем с учетом того что записи на которой он стоял уже может и не быть, поэтому ставить нужно не на конкретную запись, а именно в номер строки
Вопрос как это реализовать...
Позиция курсора в DBGrid
Модератор: Модераторы
Например так:
SQLQuery.Locate('ID', SQLQuery.FieldByName('ID').AsInteger, [loPartialKey]);
SQLQuery.Locate('ID', SQLQuery.FieldByName('ID').AsInteger, [loPartialKey]);
Дык я и грю, этой записи на которой стояли уже может и не быть
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
Если записи уже нет в выборке, то уже без разницы куда позиционировать курсор, имхо
Почему без разницы? Нужно к ближайшему от удаленного. Представь пользователь листает DBGrid на несколько страниц... Удалил запись. И все снова листать к тому же месту?
У датасетов есть у каждой строки номер RecNo. Вот, по нему и надо ориентироваться.
Он верно работает если не используются фильтры в SQLQuery. А если используются, то иногда может возникать ситуация что если удалена текущая запись, то RecNo - уже не под текущим фильтром.
donpadlo писал(а):иногда может возникать ситуация что если удалена текущая запись, то RecNo - уже не под текущим фильтром.
И что тогда произойдет? Куда встанет курсор?
Добавлено спустя 15 минут 48 секунд:
Вот тут
http://www.stikriz.narod.ru/art/dataset2.htm
Есть исходники датасета, правда, для дельфи.
Если указать несуществующий RecNo, то курсор встанет на ближайшую строчку выше с учетом фильтрации. За это отвечает метод GetRecord.
Если в Ваших датасетах это не так, то это бага. Заметьте, что грида испорльзует RecNo. И когда она удаляет, то точно так же происходит - она пытается встать на тот же RecNo или выше. Ничто не мешает запомнить RecNo, переотрыть датасет и присвоить тот же самый RecNo.
