Как запретить CurrencyManager вызывать методы BeginEdit () / EndEdit () для связанных объектов - PullRequest
3 голосов
/ 08 февраля 2011

У меня есть форма с несколькими текстовыми полями и одной сеткой данных.Один бизнес-объект может быть привязан к этой форме.Например, BO выглядит следующим образом:

class BO : IEditableObject, INotifyPropertyChanged
{
  public string FirstName {get; set;}
  public string LastName {get; set}
  public BindingList<BO> Relatives {get; set}
  // implementation of the interfaces

}

Таким образом, в форме FirstName и LastName привязаны к текстовым полям, а Relatives - к сетке.Также на форме у меня есть кнопки Сохранить и Отменить.При нажатии кнопки «Сохранить» я вызываю IEditableObject.EndEdit (), а при нажатии кнопки «Отмена» я вызываю IEditableObject.CancelEdit ().Я хочу, чтобы метод CancelEdit () отклонял все изменения, сделанные пользователем, включая изменения в Relatives, который привязан к сетке.Пока все хорошо ..

НО Элемент управления сеткой использует CurrencyManager (на самом деле сетка является элементом управления Devexpress, но это не имеет значения, так как я считаю, что элемент управления WinForms также использует его).И CurrencyManager вызывает BeginEdit () & EndEdit () для элементов в коллекции Relatives каждый раз, когда пользователь изменяет строку.Таким образом, при нажатии кнопки Cancel () только изменения в FirstName и LastName будут отменены, поскольку для дочерних объектов в коллекции Relatives EndEdit () уже был вызван базовым CurrencyManger сетки!Итак, вопрос - как запретить CurrencyManager вызывать эти методы, чтобы я мог отклонить все изменения одним вызовом?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 08 февраля 2011

Единственным решением будет удалить реализацию IEditableObject из вашего бизнес-объекта.CurrencyManager (который используется для всех привязок в Winforms) делает это самостоятельно, когда изменяется связанный объект.

Вам придется либо изменить свою логику для обработки отслеживания изменений более высокого уровня, либо удалитьинтерфейс из вашего класса, но оставить методы.Это будет означать, что вам придется каждый раз явно звонить BeginEdit, EndEdit и CancelEdit.

0 голосов
/ 13 марта 2013

Если у вас есть источник привязки, вы можете вызвать EndEdit () для события CurrentChanged, чтобы нейтрализовать BeginEdit () в CurrencyManager.

Это не предотвратит стоимость вызова BeginEdit при каждом изменении позиции.

...