以下是该方案:
我有一个编辑对话框表单,其中包含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();
}
}
虽然我不确定这是不是一个好方法。
答案 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
以保存值,则恢复绑定,如果取消,则不会。