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

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)

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

Neo*_*isk 6

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

  1. 在设置任何绑定之前txtb_name(应该可以编写代码):

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

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

    foreach(Binding b in bindingManager.Bindings)
    {
        b.DataSourceUpdateMode = DataSourceUpdateMode.Never;
    }
    
    Run Code Online (Sandbox Code Playgroud)

对于复杂的设定,你可以使用ResumeBindingSuspendBindingBindingManagerBase,它们可以被重写,以提供验证定制行为,例如,如果多个领域需要验证作为一个整体逻辑片,而不是一个接一个.

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

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

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

感谢DataSourceUpdateModeFrederik Gheysels 在可取消对话框表格上发表关于WinForms:DataBinding的文章.