|
|
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток, уважаемые. Ситуация такая. Есть cxGrid с TcxGridDBBandedTableView, у которого GridMode := True; Описываю вручную события DataController.OnSortingChanged и DataController.Filter.OnBeforeChange, тут проблем нет, они работают корректно. Кроме этих событий, есть еще реализация события OnFocusedRecordChanged (тут я в зависимости от данных управляю доступностью кнопок на форме). Так вот сама проблема. При выборе сортировки (если кликнули по колонке), после выполнения всех плановых процедур почему-то еще раз вызывается событие OnFocusedRecordChanged и почему-то передается (AFocusedRecord = nil), хотя строка выделена по итогу. Ну и как результат, все кнопки задизейблены, хотя такого не должно быть (переход на любую запись и возврат опять на первую это подтверждает). Отловить где вызывается еще раз OnFocusedRecordChanged не получилось, но это случается всегда после того как отработало полностью событие DataController.OnSortingChanged. Кто с таким сталкивался, просветите, почему такая ситуация складывается? Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 16:25 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
Потому что события focused и selected будут срабатывать дважды -- при открытии и повторном открытии датасета. Для того, чтобы было все нормально и срабатывало одно -- надо вызывать у грида BeginUpdate/EndUpdate. И вот после EndUpdate и сработают все события (если они были). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2018, 20:04 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
JaDiПотому что события focused и selected будут срабатывать дважды -- при открытии и повторном открытии датасета. Для того, чтобы было все нормально и срабатывало одно -- надо вызывать у грида BeginUpdate/EndUpdate. И вот после EndUpdate и сработают все события (если они были). Это и так понятно. Вопрос не в этом, срабатывает дополнительно еще один раз, после отработки события OnSortingChanged. Или я что-то не так понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2018, 09:16 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
Обычно на кнопки вешают Action-ы и дизаблят в OnUpdate. Вы дизаблете в зависимости от данных, грид то тут причём ? Полагаться на OnFocusedRecordChanged не стоит. Завтра поменяете Грид на другой, а в нём нет такого события (гипотетически) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2018, 09:25 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
Кстати, focused не всегда срабатывает (т.е. фокус может поменяться, но события не будет -- уже не помню, в каких именно ситуациях). Поэтому везде selected использую, он точно всегда работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2018, 09:40 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
JaDiКстати, focused не всегда срабатывает (т.е. фокус может поменяться, но события не будет -- уже не помню, в каких именно ситуациях). Поэтому везде selected использую, он точно всегда работает. На selected в бэндовых гридах при переходе постранично пропадает отрисовка, потому и перешел на focused, с ним у меня проблем не было ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2018, 11:52 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
DimaBrОбычно на кнопки вешают Action-ы и дизаблят в OnUpdate. Вы дизаблете в зависимости от данных, грид то тут причём ? Полагаться на OnFocusedRecordChanged не стоит. Завтра поменяете Грид на другой, а в нём нет такого события (гипотетически) А кто говорит про грид? Я работаю с DBBandedTableView, событие это есть и переходить на другой не собираюсь. Если чисто гипотетически надо будет перейти на другой грид, то это будет уже совершенно другая проблема и реализация, ежу понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2018, 12:53 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
Леонов ЮрийА кто говорит про грид? Я работаю с DBBandedTableView, событие это есть и переходить на другой не собираюсь. Если чисто гипотетически надо будет перейти на другой грид, то это будет уже совершенно другая проблема и реализация, ежу понятно. У вас DBBandedTableView - то есть вы работаете с данными в Dataset, а грид - интрумент для отображения данных. Зачем брать данные с промежуточного элемента ? Работайте напрямую с Dataset ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2018, 15:57 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
DimaBrУ вас DBBandedTableView - то есть вы работаете с данными в Dataset, а грид - интрумент для отображения данных. Зачем брать данные с промежуточного элемента ? Работайте напрямую с Dataset Так отрисовка же делается на конечном контейнере, то есть на DBBandedTableView, причем тут Dataset? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2018, 11:40 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
Причём здесь отрисовка грида и задизабленные кнопки ? Вы кнопки гасите в зависимости от того где курсор датасета ? Чтобы, например, не давать редактировать какую-то запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2018, 12:24 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
DimaBrПричём здесь отрисовка грида и задизабленные кнопки ? Вы кнопки гасите в зависимости от того где курсор датасета ? Чтобы, например, не давать редактировать какую-то запись. Да дело даже не в том, на каком событии вешается доступность кнопок. Я хочу понять почему срабатывает событие OnFocusedRecordChanged без фокуса после выполнения события DataController.OnSortingChange. Где-то есть очередность срабатываний событий у TableView? Вот в чем вопрос был, а не то, что мы обсуждаем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 11:12 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
DimaBrПричём здесь отрисовка грида и задизабленные кнопки ? Вы кнопки гасите в зависимости от того где курсор датасета ? Чтобы, например, не давать редактировать какую-то запись. Да дело даже не в том, на каком событии вешается доступность кнопок. Я хочу понять почему срабатывает событие OnFocusedRecordChanged без фокуса после выполнения события DataController.OnSortingChange. Где-то есть очередность срабатываний событий у TableView? Вот в чем вопрос был, а не то, что мы обсуждаем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 11:18 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
Леонов Юрий, Обращаю внимание на: авторПри выборе сортировки (если кликнули по колонке), после выполнения всех плановых процедур почему-то еще раз вызывается событие OnFocusedRecordChanged и почему-то передается Вот эти "плановые процедуры" и стоит смотреть, что именно в них делается. А то может датасет там переоткрывается. Тогда срабатывание фокуса логично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 11:49 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
у них там порой бывает необоснованная лишняя а то и двойная работа в некоторых местах, см. например Q515220, Q515958, Q506338, в какой-то мере Q516328 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2018, 12:02 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
JaDiЛеонов Юрий, Обращаю внимание на: авторПри выборе сортировки (если кликнули по колонке), после выполнения всех плановых процедур почему-то еще раз вызывается событие OnFocusedRecordChanged и почему-то передается Вот эти "плановые процедуры" и стоит смотреть, что именно в них делается. А то может датасет там переоткрывается. Тогда срабатывание фокуса логично. Прошелся по всем процедурам, все нормально отработало, но после выхода из процедуры OnSortingChanged срабатывает еще раз OnFocusedRecordChanged, у которого AFocusedRecord=nil. Это что, нажатие на Header столбца запускает событие изменения сортировки, а потом срабатывает отжатие клавиши мыши и типа теряется фокус? Кто-то может четко прояснить почему так происходит или хотя бы ткните в доку... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2018, 16:42 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
Леонов Юрий, предлагаю сделать тестовый пример (грид, виртуальный датасет с тестовыми данными и парочка событий) и приложить сюда. Заодно подтвердить, что виновато именно OnSorting, а не что-то другое. Потому что гадать на кофейной гуще становится тяжело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2018, 17:16 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
авторПрошелся по всем процедурам, все нормально отработало Повторяю -- причина "в другом коде". Обращаю внимание на работу событий: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. FocusedRecordChanged -- срабатывает каждый раз, когда меняется Grid Mode. Более того, в грид моде FocusedRecordChanged вообще не срабатывает. Т.е. смотреть надо именно "другой код". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2018, 18:31 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
JaDi, сделал я тестовый пример, получилось вот такое: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 17:46 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
в красной рамке - выполнение события DataController.OnSortingChanged Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 17:51 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
Меня интересует, откуда вызывается OnFocusedRecordChanged после выполнения сортировки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 17:53 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
Леонов Юрийуправляю доступностью кнопок на форме)s / GridView.OnFocusedRecordChanged / GridView.DataController.DataSource.DataSet.OnAfterScroll / - не? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 18:47 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
Леонов Юрий, "лишнее" срабатывание OnFocusedRecordChanged идет из-за переоткрытия датасета -- в нем меняется фокус и соответственно девгрид на это реагирует тоже для синхронизации текущего грида с датасетом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 19:49 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
Хмм... Событие OnFocusedRecordChanged вызывается вообще при ЛЮБЫХ изменениях в датасете, даже если по факту ничего не менялось. Например, достаточно тупо вызвать MemData.Edit; MemData.Post, чтобы сработало событие. И это нормальное поведение по словам техподдержки . авторI am afraid this issue cannot be fixed, because when the Post method is called, DataSet generates a notification of the DataLink.DataSetChanged method. In the DataLink.DataSetChanged method, we cannot determine what has happened (whether data or a list of records has been changed, or simple data has been posted). When our component processes the DataLink.DataSetChanged notification, it needs to refresh all records loaded from the dataset. In this case, we cannot determine whether or not the focused record has been changed and need to raise the FocusedRecordChanged event. Короче, надо смириться и просто обрабатывать эти ситуации -- например, ввести переменную IsFreezeFocusRecordEvent, включать ее в начале обновления и отключать после всех обновлений, а в самом событии уже ее проверять и всё игнорить в нужных случаях (более правильный аналог выключения обработчика через OnFocusedRecordChanged = nil). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 20:22 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
Даже dataset.DisableControls; dataset.EnableControls; приведет к срабатыванию события. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 20:26 |
|
||
|
Сортировка и GridMode
|
|||
|---|---|---|---|
|
#18+
JaDiДаже dataset.DisableControls; dataset.EnableControls; приведет к срабатыванию события.Тем более! И именно по вышеописанной причине. Основная причина - обеспечение консистента для грида и данных. Юзер может что угодно сделать при DisableControls или переоткрытии данных. Может висеть логика на эвентах датасета, может стать невалидными букмарки и т.д. Поэтому надо гарантировано отрефрешить все внутренности датаконтроллера и грида. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 22:16 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39728195&tid=2040126]: |
0ms |
get settings: |
9ms |
get forum list: |
23ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
85ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 443ms |

| 0 / 0 |
