14

我正在通过构造函数传递客户列表。然后将其数据绑定到 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();
        }
    }
}

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

4

1 回答 1

6

据我了解,您的问题是关于取消对您的List<Customer>through所做的更改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;
    }
    

对于复杂的设置,您可以使用BindingManagerBaseResumeBindingSuspendBinding,它们可以被覆盖以提供自定义的验证行为,例如,如果需要将多个字段作为一个整体逻辑部分进行验证,而不是一个一个地进行验证。

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

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

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

DataSourceUpdateMode归功于 Frederik Gheysels 关于WinForms: DataBinding on a cancellable Dialog Form的文章的提示。

于 2012-12-21T01:52:05.793 回答