如何取消通过数据绑定所做的更改?

我通过构造函数传递了一个客户列表。 然后它被数据绑定到ListBox。 我还将数据框数据转换为允许更改客户名称,它会自动更新ListBox和客户列表,这非常好。

但是,如果用户单击“取消”按钮,我希望不保留更改。 我告诉程序将客户列表设置为旧的,但它不起作用,当我再次打开窗口时,ListBox显示更新的客户名称而不是旧名称。

using System; using System.Drawing; using System.Windows.Forms; using System.Collections.Generic; namespace Bingding_Test { public partial class Form_Customers : Form { List customers; List old_customers; BindingSource bs = new BindingSource(); public Form_Actors(List _customers) { InitializeComponent(); customers = _customers; old_customers = new List(_customers); bs.DataSource = customers; listBox1.DataSource = bs; listBox1.DisplayMember = "Name"; txtb_name.DataBindings.Add("Text", bs, "Name"); } void Btn_cancelClick(object sender, EventArgs e) { actors = old_customers; this.Close(); } void Btn_saveClick(object sender, EventArgs e) { this.Close(); } } } 

任何人都知道我可以做什么来确保单击取消按钮时不保存所有更改?

据我所知,您的问题是如何通过txtb_name取消对List txtb_name 。 默认情况下, DataBindings在validation通过时自动应用更改。 您可以控制DataSourceUpdateMode以不同的方式更改此行为,具体取决于您的实现:

  1. txtb_name上设置任何绑定txtb_name (应该可以编写代码的方式):

     txtb_name.DataBindings.DefaultDataSourceUpdateMode = DataSourceUpdateMode.Never; 
  2. txtb_name上设置绑定后(也可以使用您的代码):

     foreach( Binding b in txtb_name.DataBindings) { b.DataSourceUpdateMode = DataSourceUpdateMode.Never; } 
  3. 使用BindingManagerBase ( CurrencyManager或PropertyManager )设置绑定后 – 更通用的方法,因为它允许您一次性处理许多控件,在项目发展时可能会有用。

     foreach(Binding b in bindingManager.Bindings) { b.DataSourceUpdateMode = DataSourceUpdateMode.Never; } 

对于复杂的设置,您可以使用BindingManagerBase的ResumeBinding和SuspendBinding ,它们可以被覆盖以在validation时提供自定义行为,例如,如果需要将多个字段validation为整个逻辑块,而不是逐个validation。

请注意,即使你设置了DataSourceUpdateMode = DataSourceUpdateMode.Never , 根据MSDN ,总会有一个更新通过(参见备注部分):

即使将更新模式设置为“从不”,也会在首次创建绑定时更新数据源,因此至少会发生一次更新。

如果这对您来说是不可接受的,即您正在构建具有非常严格要求的企业级应用程序,我建议手动处理所有内容 – 停止使用DataBindings

感谢DataSourceUpdateMode提示Frederik Gheysels 在可取消的Dialog Form上发表关于WinForms:DataBinding的文章。