2013-03-06 2 views
2

Я пишу приложение с вкладками WinForms, которое содержит несколько элементов управления DataGridView, привязанных к BindingSources. BindingSources, в свою очередь, привязаны к BindingLists бизнес-объектов. Мои бизнес-объекты реализуют INotifyPropertyChanged.Обнаружение изменений в BindingSource/BindingList

My TabControl имеет три вкладки (A, B и C). Если мой пользователь внес изменения в данные элемента управления DataGridView на вкладке A, а затем попытается перейти на вкладку B или C без внесения изменений (в этом случае, записи данных на диск), мне нужно предложить им сохранить изменяет или теряет их.

Чтобы определить, были ли внесены изменения на данной вкладке, я создал переменные pendingChange для каждой вкладки. Каждый элемент управления DataGridView имеет собственный обработчик событий CellValidating, где я проверяю данные, когда пользователь вносит изменения. В конце обработчика события, если изменение прошло все проверки проверки, я установил переменную pendingChange для этой вкладки в true. Когда мой пользователь нажимает кнопку, чтобы записать изменения на диск, я возвращаю переменную pendingChange. Поэтому в любое время, когда мой пользователь пытается перейти на другую вкладку, я проверяю эту переменную, чтобы определить, есть ли какие-либо изменения, которые необходимо сохранить в первую очередь.

Теперь я понял, что большой недостаток этой конструкции заключается в том, что событие CellValidating для элемента управления DataGridView запускается каждый раз, когда ячейка теряет фокус. Поэтому теперь мне нужно найти другой способ отслеживать, когда значение ячейки было изменено. Есть ли еще одно событие, которое предоставляет элемент управления DataGridView, который лучше подходит для этой цели? Или, возможно, есть событие для BindingList, которое поможет мне достичь этой функциональности? Если мне нужно, я могу добавить логическое свойство «изменено» в свой бизнес-объект и обновить его по мере необходимости. Если это можно избежать, я бы хотел, потому что один из BindingLists содержит 150 000 объектов в любой момент времени и итерации через это может быть не очень быстро.

ответ

1

BindingSource имеет Events. Например. CurrentChanged Событие происходит, когда изменяется связанный элемент.

+0

Благодарим за предложение. Я закончил использование события ListChanged для BindingSource, и это позволило мне решить мою проблему. – user685869

Смежные вопросы