The*_*lar 14 c# data-binding winforms
我通过构造函数传递了一个客户列表.然后它被数据绑定到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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都知道我可以做什么来确保单击取消按钮时不保存所有更改?
据我所知,您的问题是关于取消对您的List<Customer>通过所做的更改txtb_name.默认情况下,DataBindings在验证通过时自动应用更改.您可以控制DataSourceUpdateMode以不同的方式更改此行为,具体取决于您的实现:
在设置任何绑定之前txtb_name(应该可以编写代码):
txtb_name.DataBindings.DefaultDataSourceUpdateMode = DataSourceUpdateMode.Never;
Run Code Online (Sandbox Code Playgroud)设置绑定后txtb_name(也可以使用您的代码):
foreach( Binding b in txtb_name.DataBindings)
{
b.DataSourceUpdateMode = DataSourceUpdateMode.Never;
}
Run Code Online (Sandbox Code Playgroud)使用BindingManagerBase(CurrencyManager或PropertyManager)设置绑定后- 更通用的方法,因为它允许您一次性处理许多控件,在项目发展时可能会有用.
foreach(Binding b in bindingManager.Bindings)
{
b.DataSourceUpdateMode = DataSourceUpdateMode.Never;
}
Run Code Online (Sandbox Code Playgroud)对于复杂的设定,你可以使用ResumeBinding和SuspendBinding的BindingManagerBase,它们可以被重写,以提供验证定制行为,例如,如果多个领域需要验证作为一个整体逻辑片,而不是一个接一个.
请注意,即使你设置了DataSourceUpdateMode = DataSourceUpdateMode.Never,根据MSDN,总会有一个更新通过(参见备注部分):
即使将更新模式设置为"从不",也会在首次创建绑定时更新数据源,因此至少会发生一次更新.
如果这对您来说是不可接受的,即您正在构建一个具有非常严格要求的企业级应用程序,我建议手动处理所有内容 - 停止使用DataBindings.
感谢DataSourceUpdateModeFrederik Gheysels 在可取消对话框表格上发表关于WinForms:DataBinding的文章.