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

C# 如何取消通过数据绑定所做的更改?,c#,winforms,data-binding,C#,Winforms,Data Binding,我正在通过构造器传递客户列表。然后将其数据绑定到列表框。我还绑定了一个文本框,允许更改客户的名称,它会自动更新列表框和客户列表,这非常好 但是,如果用户单击“取消”按钮,我希望不会保留更改。我告诉程序将客户列表设置为旧名称,但它不起作用,当我再次打开窗口时,列表框显示更新的客户名称,而不是旧名称 using System; using System.Drawing; using System.Windows.Forms; using System.Collections.Generic; na

我正在通过构造器传递客户列表。然后将其数据绑定到列表框。我还绑定了一个文本框,允许更改客户的名称,它会自动更新列表框和客户列表,这非常好

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

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();
        }
    }
}
使用系统;
使用系统图;
使用System.Windows.Forms;
使用System.Collections.Generic;
名称空间Bingding_检验
{
公共部分类表单\客户:表单
{
列出客户名单;
列出老客户名单;
BindingSource bs=新的BindingSource();
公共表单参与者(列出客户)
{
初始化组件();
顾客=_顾客;
旧客户=新名单(_客户);
bs.DataSource=客户;
listBox1.DataSource=bs;
listBox1.DisplayMember=“Name”;
txtb_name.DataBindings.Add(“Text”,bs,“name”);
}
作废Btn\u取消单击(对象发送方,事件参数e)
{
参与者=老客户;
这个。关闭();
}
void Btn_saveClick(对象发送方,事件参数e)
{
这个。关闭();
}
}
}

有人知道我可以做什么来确保在单击“取消”按钮时不会保存所有更改吗?

据我所知,您的问题是通过
txtb_name
取消对
列表所做的更改。默认情况下,
数据绑定
在验证通过时自动应用更改。您可以控制
DataSourceUpdateMode
以不同的方式更改此行为,具体取决于您的实现:

  • txtb_name
    上设置任何绑定之前(应该可以使用代码的编写方式):

  • txtb_name
    上设置绑定后(也可以使用您的代码):

  • 使用(或)-更通用的方法设置绑定后,因为它允许您一次处理多个控件,所以在项目发展时可能会很有用

    foreach(Binding b in bindingManager.Bindings)
    {
        b.DataSourceUpdateMode = DataSourceUpdateMode.Never;
    }
    
  • 例如,如果需要将多个字段作为一个完整的逻辑块进行验证,而不是逐个进行验证,则可以重写它们以提供验证时的自定义行为

    请注意,即使设置了
    DataSourceUpdateMode=DataSourceUpdateMode.Never
    ,也始终会有一个更新(请参见备注部分):

    即使将更新模式设置为从不,数据源也将被删除 在第一次创建绑定时更新,因此至少需要一次更新 永远都会发生

    如果这对您来说是不可接受的,即您正在构建一个要求非常严格的企业级应用程序,我建议您手动处理所有事情-停止使用
    数据绑定


    Frederik Gheyses在他的文章中提到了
    DataSourceUpdateMode

    当你说手动绑定时,你的意思是根本不使用数据绑定吗?例如-->textBox1.Text=variable.strName.@TheScholar:看起来我错了,也就是说,你可以用数据绑定实现取消-请参阅我的编辑。谢谢!我将对此进行分析,看看它是否解决了我的问题:D@TheScholar:查看我的最终编辑,希望它现在能把事情弄清楚。谢谢Neolik,它非常有用!
    foreach( Binding b in txtb_name.DataBindings)
    {
        b.DataSourceUpdateMode = DataSourceUpdateMode.Never;
    }
    
    foreach(Binding b in bindingManager.Bindings)
    {
        b.DataSourceUpdateMode = DataSourceUpdateMode.Never;
    }