数据绑定到对象 - 如何取消数据源更改

时间:2018-02-06 09:15:00

标签: c# .net winforms data-binding bindingsource

以下是该方案: 我有一个编辑对话框表单,其中包含BindingSource和一些数据绑定文本框:

Edit Dialogue form

我将一个实体传递给表单构造函数,然后将其加载到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 个答案:

答案 0 :(得分:2)

作为一个选项,在设置数据绑定时,您可以将它们设置为永远不会更新数据源。

然后,在您要应用更改时,例如按下OK按钮时,可以设置数据绑定以更新属性更改时的数据源,然后调用绑定源的结束编辑方法。 / p>

对于Cancel按钮,您无需执行任何操作,因为数据源未更新。

示例

在表单加载事件中:

this.BindingContext[bindingSource].Bindings.Cast<Binding>().ToList()
    .ForEach(b=>b.DataSourceUpdateMode= DataSourceUpdateMode.Never);

按OK时:

this.BindingContext[productBindingSource].Bindings.Cast<Binding>().ToList()
    .ForEach(b => b.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged);
productBindingSource.EndEdit();

您可以下载/克隆完整的源代码:

答案 1 :(得分:0)

您可以在加载值后使用SuspendBinding方法 之后,在您致电ResumeBinding

之前,这些值不应更新来源
  

SuspendBinding和ResumeBinding是两种允许在简单绑定方案中临时暂停和恢复数据绑定的方法。如果必须允许用户在验证发生之前对数据字段进行多次编辑,则通常会暂停数据绑定。例如,如果必须按照第二个字段更改一个字段,但验证第一个字段会导致第二个字段出错。

根据文档,您应该能够将其与文本框一起使用。如果用户单击Ok以保存值,则恢复绑定,如果取消,则不会。