Элемент управления Windows Forms с привязкой к данным не распознает изменения до потери фокуса - PullRequest
5 голосов
/ 29 июня 2009

Я использую привязку данных для отображения значений в текстовых полях в клиенте C # Windows Forms. Когда пользователь нажимает кнопку Сохранить, я сохраняю свои изменения в базе данных. Однако новое значение в активном редакторе игнорируется (предыдущее значение сохраняется). Если я выхожу из активного редактора и затем сохраняю, новое значение сохраняется, как и ожидалось.

Есть ли способ заставить активный элемент управления принять его значение перед сохранением?

Ответы [ 3 ]

5 голосов
/ 29 июня 2009

Если вы можете получить экземпляр Binding, который соответствует входу (TextBox), вы можете вызвать метод WriteValue чтобы принудительно передать значение из элемента управления объекту, к которому оно привязано.

Кроме того, вы можете вызвать EndCurrentEdit метод для BindingManagerBase класса (обычно CurrencyManager class instance), чтобы завершить редактирование , но это требует реализации интерфейса ICancelAddNew или IEditableObject на объекте, к которому привязан (и не потребует от вас ловить рыбу для привязки).

3 голосов
/ 24 марта 2012

Решение, которое я использовал, заключается в том, чтобы вызвать ValidateChildren в форме из события Save (вызова), прежде чем фактически сохранить записи базы данных. Это вызывает проверку всех полей и, таким образом, привязку происходит без потери фокуса элемента управления, редактируемого в данный момент в форме. Это очень удобно, если кнопка «Сохранить» находится в системе меню Windows, а не в самой форме - плюс она возвращает значение «Ложь», если данные в любом элементе управления в форме недействительны, и, следовательно, может использоваться для предотвращения сохранения ошибочных данных.

Это также позволяет избежать противоречивого обновления связанного поля, которое происходит, когда OnPropertyChanged используется в качестве метода привязки вместо OnValidation. Кроме того, очень важно, чтобы для метода привязки было задано значение Никогда, при этом отдельные вызовы WriteValue выполняются для каждого подтвержденного события, захваченного для каждого элемента управления.

2 голосов
/ 29 июня 2009

Это своего рода хак, но попробуйте установить фокус вдали от активного редактора (установив фокус на что-то другое, например, кнопку «Сохранить») в событии кнопки, прежде чем вызывать функцию сохранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...