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

时间:2012-12-21 01:44:48

标签: c# winforms data-binding

我通过构造函数传递了一个客户列表。然后它被数据绑定到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();
        }
    }
}

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

1 个答案:

答案 0 :(得分:6)

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

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

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

    foreach( Binding b in txtb_name.DataBindings)
    {
        b.DataSourceUpdateMode = DataSourceUpdateMode.Never;
    }
    
  3. 使用BindingManagerBaseCurrencyManagerPropertyManager)设置绑定后 - 更通用的方法,因为它允许您一次性处理许多控件,可能会在你的项目在不断发展。

    foreach(Binding b in bindingManager.Bindings)
    {
        b.DataSourceUpdateMode = DataSourceUpdateMode.Never;
    }
    
  4. 对于complex setups,您可以使用ResumeBindingSuspendBindingBindingManagerBase,可以覆盖它们以在验证时提供自定义行为,例如,如果需要验证多个字段作为一个整体的逻辑片段,而不是一个接一个。

    请注意,即使您设置了DataSourceUpdateMode = DataSourceUpdateMode.Never,也会有一个更新,according to MSDN(请参阅备注部分):

      

    即使更新模式设置为从不,数据源也将是   首次创建绑定时更新,因此至少有一次更新   将永远发生。

    如果您无法接受,即您正在构建具有非常严格要求的企业级应用程序,我建议您手动处理所有内容 - 停止使用DataBindings

    有关DataSourceUpdateMode的提示,请参阅Frederik Gheysels关于WinForms: DataBinding on a cancellable Dialog Form的文章。