如何取消通过数据绑定所做的更改?
我通过构造函数传递了一个客户列表。 然后它被数据绑定到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
以不同的方式更改此行为,具体取决于您的实现:
-
在
txtb_name
上设置任何绑定txtb_name
(应该可以编写代码的方式):txtb_name.DataBindings.DefaultDataSourceUpdateMode = DataSourceUpdateMode.Never;
-
在
txtb_name
上设置绑定后(也可以使用您的代码):foreach( Binding b in txtb_name.DataBindings) { b.DataSourceUpdateMode = DataSourceUpdateMode.Never; }
-
使用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的文章。