Как избежать массового уведомления в данных DataBinding

StackOverflow https://stackoverflow.com/questions/1177682

  •  19-09-2019
  •  | 
  •  

Вопрос

Я предполагаю, что это довольно распространенная проблема в сценариях данных. Что вы обычно делаете, если вы запускаете пакетное обновление и хотите избежать того, что расчеты/действия/действия/все, что выполняются для каждого обновления?

Первое, что обычно приходит мне в голову, - это либо представить новую логическую или отбрасывать/зацепить Eventhandler, ...

Что мне не нравится в этих подходах:

  • Они вводят новую сложность (нужно поддерживать, ...)
  • Они склонны к ошибкам, потому что вы должны убедиться, что потом отправляются подавленные уведомления

Мне интересно, решает ли кто -нибудь эту проблему более удобным способом, с которым легче справиться?

Тиа Мартин

РЕДАКТИРОВАТЬ: Не для того, чтобы не считать меня. Я знаю о вещах .NET предоставляет как RaiselistchangeNevents из BindingList, ... все они решают проблему более/менее так же, как я описал, но я ищу другой способ, который не должен перечислять недостатки Анкет Может быть, я не на том пути, но хотя я попробую здесь ...

Это было полезно?

Решение

К сожалению, нет единого решения для одного размера. Я применил или видел следующие решения:

  1. Есть два сингла. Один сигнал испускается, когда изменение происходит от действия пользователя, другой всегда стреляет. Это позволяет различать изменения в пользовательском интерфейсе и обновления по коду.

  2. Логический для защиты кода

  3. Структура событий свойства останавливает автоматическое распространение событий, когда значение не изменилось.

  4. Метод замораживания/оттаивания на сигнале или диспетчера сигнала (то есть вся структура)

  5. Способ слияния сигналов в один. Вы можете делать N обновления, и они собираются в M Signals, где M <= N. Если вы измените одно и то же свойство 100 раз, вы все равно получаете только 1 сигнал.

  6. Очередь сигналов (вместо синхронного исполнения). Код очереди может затем объединить сигналы. Я использовал это с большим успехом в приложении, у которого нет кнопки «Сохранить». Все изменения сохраняются в базе данных по мере их их создания. Когда вы меняете текст, изменения объединяются в течение определенного времени (а именно до возврата предыдущего обновления БД), а затем они будут совершены как единое изменение.

  7. API, чтобы установить несколько значений одновременно; Только один сигнал испускается.

  8. Сигнальная структура может отправлять сигналы на разных уровнях детализации. Скажем, у вас есть человек с именем. Когда вы измените имя, вы получаете два сигнала: один для изменения имени и одно «поля экземпляра изменяется». Так что, если вы только заботитесь, «что -то изменилось», то вы можете зацепить экземпляр вместо всех полей.

Другие советы

Какая платформа? Пост заставляет меня думать .NET.

Каковы основные объекты? Например, BindingList<T> В качестве источника позволяет отключить уведомления путем настройки RaiseListChangedEvents Ложь во время выполнения обновления.

Кроме этого (или аналогичного); Да, отключите привязку во время больших обновлений

Самый простой путь, чтобы использовать BindingSource компонент для вашего привязки данных. Вместо того, чтобы привязывать ваши элементы управления с конкретным объектом (или илистом), используйте этот объект в качестве DataSource для BindingSource, затем свяжите элементы управления с BindingSource.

А BindingSource класс имеет SuspendBinding() а также ResumeBinding() функции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top