【问题标题】:How to cancel changes made through Databinding?如何取消通过数据绑定所做的更改?
【发布时间】:2012-12-08 14:58:17
【问题描述】:

我正在通过构造函数传递客户列表。然后将其数据绑定到 ListBox。我还绑定了一个 Textbox 以允许更改客户名称,它会自动更新 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();
        }
    }
}

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

【问题讨论】:

    标签: c# winforms data-binding


    【解决方案1】:

    据我了解,您的问题是关于取消对您的 List&lt;Customer&gt;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;
      }
      

    对于complex setups,您可以使用ResumeBinding 中的SuspendBindingBindingManagerBase,它们可以被覆盖以提供自定义的验证行为,例如,如果多个字段需要作为一个整体逻辑部分进行验证,而不是一个接一个。

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

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

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

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

    【讨论】:

    • 当您说手动绑定时,您的意思是根本不使用数据绑定吗?例如 --> textBox1.Text = variable.strName.
    • @TheScholar:看来我错了,即您可以使用 DataBindings 实现取消 - 请参阅我的编辑。
    • 感谢 Neolisk!我会分析一下,看看它是否能解决我的问题:D
    • @TheScholar:检查我的最终编辑,希望它现在清楚了。
    • 感谢 Neolisk,非常有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2023-03-28
    • 2018-07-16
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多