我通过构造函数传递了一个客户列表。然后它被数据绑定到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<Customer> customers;
List<Customer> old_customers;
BindingSource bs = new BindingSource();
public Form_Actors(List<Customer> _customers)
{
InitializeComponent();
customers = _customers;
old_customers = new List<Customer>(_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();
}
}
}
当我点击取消按钮时,任何人都知道我可以做些什么来确保不保存所有更改?
答案 0 :(得分:6)
据我了解,您的问题是如何取消对List<Customer>
到txtb_name
所做的更改。默认情况下,DataBindings
会在验证通过后自动应用更改。您可以控制DataSourceUpdateMode
以不同的方式更改此行为,具体取决于您的实施:
在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;
}
对于complex setups,您可以使用ResumeBinding的SuspendBinding和BindingManagerBase,可以覆盖它们以在验证时提供自定义行为,例如,如果需要验证多个字段作为一个整体的逻辑片段,而不是一个接一个。
请注意,即使您设置了DataSourceUpdateMode = DataSourceUpdateMode.Never
,也会有一个更新,according to MSDN(请参阅备注部分):
即使更新模式设置为从不,数据源也将是 首次创建绑定时更新,因此至少有一次更新 将永远发生。
如果您无法接受,即您正在构建具有非常严格要求的企业级应用程序,我建议您手动处理所有内容 - 停止使用DataBindings
。
有关DataSourceUpdateMode
的提示,请参阅Frederik Gheysels关于WinForms: DataBinding on a cancellable Dialog Form的文章。