![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как отловить момент, когда в DBGrid-е перешли на другую запись?
Bless © (2006-07-03 12:58:00)Очевидный ответ - написать обработчик события ADODataSet1.AfterScroll.
Но тут имеется один неприятный момент:
если мы находясь посредине грида (не обязательно посредине, лишь бы не на первой(последней) записи), нажимая стрелочки (именно стрелочки, а не home, end), попали на первую (последнюю) запись, то последующее нажатие клавиши вверх (вниз) сгенерирует еще одно событие AfterScroll, хотя мы так и остаемся на первой (последней) записи.
И хотя такое поведение вполне объяснимо, эти два AfterScroll-а с точки зрения моей логики лишние.
Как бы мне отследить, что хотя AfterScroll возник, на другую запись мы не перешли?
(2006-07-04 15:00:00) [1]Удалено модератором
Johnmen (2006-07-04 11:49:00) [2]>Bless ©
Я бы запоминал значение ключевого поля в BeforeScroll, а в AfterScroll сравнивал с текущим и при несовпадении давил бы деталь (если она активна).
ЮЮ (2006-07-04 02:49:00) [3]
> Медвед (03.07.06 21:31) [10]
Для закрытия, естественно (см.[7]). Это понятно и ежу :)
(2006-07-03 21:31:00) [4]Удалено модератором
Bless (2006-07-03 19:47:00) [5]
> evvcom © (03.07.06 17:35) [8]
> Не вижу проблемы.
> Bless © (03.07.06 17:23) [7]
> Это не проблема и я ее уже решил.
evvcom (2006-07-03 17:35:00) [6]> [7] Bless © (03.07.06 17:23)
Надеюсь в нижний грид/датасет ключевой параметр передаешь? Ну и сравнивай его с полем в верхнем гриде/датасете и делай вывод, переоткрывать или нет. Не вижу проблемы.
Bless (2006-07-03 17:23:00) [7]Плохиш © (03.07.06 15:16) [6]>
Есть два грида. В нижнем гриде отображаются некоторые данные, соответствующие текущей строке в верхнем гриде. Короче говоря, master-detail.
Но я не хочу переоткрывать датасет, соответствующий нижнему гриду всякий раз, как изменилась запись в первом датасете, чтоб не гонять ненужные запросы по сети в случае простого скроллирования по верхнему гриду в поисках нужной записи.
Нижний датасет открываю только по даблклику (или Enter-у).
И закрываю, когда на верхнем гриде ушли с текущей записи (OnAfterScroll).
Все нормально. Вот только если человек даблкликнул на первой строчке в верхнем гриде (нижний грид заполнился), а потом (пусть нечаянно) нажал кнопочку "вверх", то AfterScroll закроет нижний грид, хотя запись в верхнем гриде осталась той же.
Это не проблема и я ее уже решил. Просто хотелось услышать чужие мнения по этому поводу. Всегда есть вероятность, что тривиальный ответ лежит на поверхности, а я его не вижу :)
Короче, я надеялся, а вдруг будет ответ в духе "RTFM, набери слово .... и нажми F1"
Плохиш (2006-07-03 15:16:00) [8]
> Bless © (03.07.06 14:08) [5]
Можно узнать, что за обработка проводиться, что для неё критично количество вызовов событий OnAfterScroll?
Bless (2006-07-03 14:08:00) [9]проверяй BOF, EOF. по идее первый переход не взведет этот флаг, а во втором он будет установлен.
Но ведь на первую запись и по Ctrl+Home могли переместиться, а в этом случае bof= true сразу.
Я хочу сказать, не всякому bof = true соответствует фальшивый AfterScroll.
sniknik (2006-07-03 13:20:00) [10]> Как бы мне отследить, что хотя AfterScroll возник, на другую запись мы не перешли?
проверяй BOF, EOF. по идее первый переход не взведет этот флаг, а во втором он будет установлен.
Плохиш (2006-07-03 13:19:00) [11]
> Как бы мне отследить, что хотя AfterScroll возник, на другую
> запись мы не перешли?
Проверяй Bof и Eof у DataSet
Плохиш (2006-07-03 13:15:00) [12]
> Посмотри в сторону TDataSource.OnDataChange
Он тоже два раза вызывается.
Ega23 (2006-07-03 13:11:00) [13]Посмотри в сторону TDataSource.OnDataChange