Привязка данных к объекту - Как отменить изменения источника данных
Вот сценарий: у меня есть форма редактирования диалога с BindingSource
и некоторые связанные с данными текстовые поля на нем:
Я передаю сущность конструктору формы, и она загружается в BindingSource.DataSource
что заставляет привязанные к данным элементы управления показывать значения свойств.
Проблема в том, что пользователь редактирует значения в TextBox
контролирует и Validating
события передаются, источник данных изменяется, хотя он не применяется к БД, но он все еще может сбить пользователя с толку, когда он видит отредактированные значения в форме списка, до следующего перезапуска приложения.
поэтому возникает вопрос: как предотвратить привязку источника к мгновенному отражению изменений или как их откатить?
Я унаследовал источник привязки и создал новый источник привязки следующим образом:
public class SuperBindingSource:BindingSource
{
#region Properties
public object DataSourceBeforeChange { get; private set; }
#endregion
#region Methods
public void ResetChanges()
{
this.DataSource = this.DataSourceBeforeChange;
}
#endregion
protected override void OnDataSourceChanged(EventArgs e)
{
base.OnDataSourceChanged(e);
DataSourceBeforeChange=this.DataSource.DeepClone();
}
}
Хотя я не уверен, что это хороший подход.
2 ответа
Как вариант, при настройке привязок данных вы можете настроить их на обновление источника данных никогда.
Затем в тот момент, когда вы хотите применить изменения, например, при нажатии OK
Кнопка, вы можете установить привязки данных для обновления источника данных при изменении свойства, а затем вызвать метод end edit источника привязки.
За Cancel
Кнопка, вам не нужно ничего делать, потому что источник данных не обновляется.
пример
В событии загрузки формы:
this.BindingContext[bindingSource].Bindings.Cast<Binding>().ToList()
.ForEach(b=>b.DataSourceUpdateMode= DataSourceUpdateMode.Never);
При нажатии ОК:
this.BindingContext[productBindingSource].Bindings.Cast<Binding>().ToList()
.ForEach(b => b.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged);
productBindingSource.EndEdit();
Вы можете скачать / клонировать полный исходный код:
Вы можете использовать SuspendBinding
метод после загрузки значений.
После этого значения не должны обновлять источник, пока вы не позвоните ResumeBinding
:
SuspendBinding и ResumeBinding - это два метода, которые позволяют временно приостанавливать и возобновлять привязку данных в сценарии простого связывания. Обычно вы приостанавливаете привязку данных, если пользователю нужно разрешить несколько изменений в полях данных до проверки. Например, если одно поле должно быть изменено в соответствии со вторым, но при проверке первого поля возникнет ошибка во втором поле.
Согласно документации, вы должны быть в состоянии использовать это с вашими текстовыми полями. Если пользователь нажимает Ok
чтобы сохранить значения, вы возобновляете привязку, а если он отменяет, то нет.