Как предотвратить полную перезагрузку данных DevExpress TcxGrid/TcxDBDataController после простой публикации?

Я использую DevExpress TcxGrid в приложении Delphi 2009 (правильно, IDE 100-летней давности), и у меня есть следующий стек вызовов (из madExcept):

SplendidSoft.exe SplendidDMU              1051  +3 TSplendidDM.ImportedDataCSAfterScroll
SplendidSoft.exe DB                                    TDataSet.DoAfterScroll
SplendidSoft.exe DB                                    TDataSet.First
SplendidSoft.exe cxDBData                     2056 +21 TcxDBDataProvider.First
SplendidSoft.exe cxCustomData                 7638 +17 LoadData
SplendidSoft.exe cxCustomData                 7689  +6 TcxCustomDataController.LoadStorage
SplendidSoft.exe cxDBData                     4943  +3 TcxDBDataController.LoadStorage
SplendidSoft.exe cxCustomData                 7893 +20 TcxCustomDataController.UpdateStorage
SplendidSoft.exe cxCustomData                 7991 +16 TcxCustomDataController.DataChanged
SplendidSoft.exe cxCustomData                11107  +2 TcxCustomDataProvider.DataChanged
SplendidSoft.exe cxDBData                     1459 +53 TcxDBDataLink.DataSetChanged
SplendidSoft.exe DB                                    TDataLink.DataEvent
SplendidSoft.exe cxDBData                     1399  +1 TcxDBDataLink.DataEvent
SplendidSoft.exe DB                                    TDataSource.NotifyLinkTypes
SplendidSoft.exe DB                                    TDataSource.NotifyDataLinks
SplendidSoft.exe DB                                    TDataSource.DataEvent
SplendidSoft.exe DB                                    TDataSet.DataEvent
SplendidSoft.exe DBClient                              TCustomClientDataSet.DataEvent
SplendidSoft.exe DB                                    TDataSet.Resync
SplendidSoft.exe DB                                    TDataSet.Post
SplendidSoft.exe DBClient                              TCustomClientDataSet.Post
SplendidSoft.exe DB                                    TDataSet.CheckBrowseMode
SplendidSoft.exe SplendidFormU   295  +4           TSplendidForm.cxButton2Click

cxButton2Click просто вызывает Post для базового набора данных, и можно видеть, что это простое сообщение инициировало цепочку событий, которая приводит к полной перезагрузке данных и, следовательно, к множеству событий AfterScroll.

Почему это так? Post просто сохраняет все данные, которые уже есть в текущей записи/ячейках сетки, поэтому нет необходимости перезагружать даже одну запись. Но TcxDBDataProvider перезагружает весь набор данных, почему так и как этого избежать? Это стандартное поведение TcxGrid? И почему это так странно?


person TomR    schedule 26.08.2019    source источник
comment
Что говорит об этом служба поддержки Devex? Они должны быть первыми, кто спросит.   -  person MartynA    schedule 26.08.2019
comment
cxGrid довольно сложен - если вы собираетесь создавать или поддерживать код, используя его, то некоторое время, потраченное на изучение компонента, окупится, а не на то, чтобы разобраться во всем, когда вы работаете над частями приложения/базы кода. У них также действительно хорошая поддержка, а в более новых версиях улучшена производительность, поэтому получение текущей подписки также может помочь.   -  person Brian    schedule 26.08.2019
comment
SmartRefresh это то, что вы ищете.   -  person BrakNicku    schedule 26.08.2019


Ответы (1)


Если выполняются некоторые условия, вы можете использовать SmartRefresh.

   cxGrid1DBTableView1.DataController.DataModeController.SmartRefresh := true;

Обязательно прочтите справку, так как есть некоторые ограничения, например:

Примечание. Если контроллер данных находится в режиме интеллектуального обновления и управление записями наборов данных осуществляется через контроллер данных, записи обновляются автоматически. Если записи набора данных изменяются с помощью методов набора данных или внешних элементов управления, необходимо вручную вызвать метод UpdateItems, чтобы перезагрузить все записи с новыми данными.

Это означает, что вам нужно использовать DataController.* вместо методов TDataSet.*.

// Use DataController methods   
cxGrid1DBTableView1.DataController.Post();
// Instead of TDataSet methods
FDTable1.Post;
person Brian    schedule 26.08.2019