Подтвердить что ты не робот

Как отменить изменения, сделанные с помощью привязки данных?

Я передаю список клиентов через конструктор. Затем он привязывается к 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();
        }
    }
}

Кто-нибудь знает, что я могу сделать, чтобы убедиться, что все изменения не сохранены, когда я нажимаю кнопку отмены?

4b9b3361

Ответ 1

Насколько я понял, ваш вопрос заключается в том, чтобы отменить изменения, внесенные в ваш List<Customer> через txtb_name. По умолчанию DataBindings автоматически применяет изменения, когда проверка прошла. Вы можете управлять DataSourceUpdateMode, чтобы изменить это поведение по-разному, в зависимости от вашей реализации:

  • Прежде чем устанавливать какие-либо привязки на txtb_name (должно быть возможно с тем, как написан ваш код):

    txtb_name.DataBindings.DefaultDataSourceUpdateMode = DataSourceUpdateMode.Never;
    
  • После установки привязок на txtb_name (также возможно с вашим кодом):

    foreach( Binding b in txtb_name.DataBindings)
    {
        b.DataSourceUpdateMode = DataSourceUpdateMode.Never;
    }
    
  • После того, как вы установили привязки с помощью BindingManagerBase (CurrencyManager или PropertyManager) - более общий подход, поскольку он позволяет обрабатывать многие элементы управления одним выстрелом, может пригодиться когда ваш проект развивается.

    foreach(Binding b in bindingManager.Bindings)
    {
        b.DataSourceUpdateMode = DataSourceUpdateMode.Never;
    }
    

Для сложных настроек вы можете использовать ResumeBinding и SuspendBinding BindingManagerBase, они могут быть переопределить для обеспечения пользовательского поведения при проверке, например, если несколько полей должны быть проверены как целая логическая часть, а не поочередно.

Обратите внимание, что даже если вы установите DataSourceUpdateMode = DataSourceUpdateMode.Never, всегда будет одно обновление, в соответствии с MSDN (см. раздел "Примечания" )

Даже если для режима обновления установлено значение Никогда, источником данных будет обновляется, когда привязка сначала создается, поэтому, по крайней мере, одно обновление всегда будет иметь место.

Если это неприемлемо для вас, т.е. вы создаете приложение корпоративного класса с очень строгими требованиями, я предлагаю обрабатывать все вручную - прекратите использование DataBindings.

Кредит за подсказку DataSourceUpdateMode отправляется Фредерику Гейзелю за его статью о WinForms: DataBinding в аннулируемой форме диалога.