Привязка данных к объекту - Как отменить изменения источника данных

Вот сценарий: у меня есть форма редактирования диалога с 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 чтобы сохранить значения, вы возобновляете привязку, а если он отменяет, то нет.

Другие вопросы по тегам