привязка данных нескольких полей в пользовательском интерфейсе не обновляется

У меня есть winform, который содержит источник привязки, источником данных которого является типизированный набор данных. Я привязал в дизайнере два текстовых поля к одному столбцу. Когда я обновляю любое текстовое поле, столбец DataRow в DatSet обновляется правильно, однако значение другого текстового поля в форме не обновляется.

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

ПРИМЕЧАНИЕ: это упрощенный пример, который мне нужно сделать, потому что в реальном приложении, поскольку один элемент управления доступен для редактирования пользователем, другой является входом в составной элемент управления для вычислений.

// Taken from InitializeComponent()
this.productsBindingSource.DataMember = "Products";    
this.productsBindingSource.DataSource = this.dataSet1;
this.textBox1.DataBindings.Add(new Binding("Text", this.productsBindingSource, "UnitsInStock", true, DataSourceUpdateMode.OnPropertyChanged));
this.textBox2.DataBindings.Add(new Binding("Text", this.productsBindingSource, "UnitsInStock", true, DataSourceUpdateMode.OnPropertyChanged));

// Taken from Form Load Event          
DataSet1TableAdapters.ProductsTableAdapter adapter = new DataSet1TableAdapters.ProductsTableAdapter();
adapter.Fill(dataSet1.Products);

person John Hunter    schedule 08.03.2011    source источник


Ответы (2)


В MSDN есть статья, которая может помочь - см. Как в: обеспечить синхронизацию нескольких элементов управления, привязанных к одному источнику данных

По сути, вам нужно настроить обработчик событий для события BindingComplete BindingSource (как вы это сделали, вам нужно, чтобы FormattingEnabled был установлен на True, чтобы это работало)

Затем в обработчике событий BindingComplete у вас есть этот код:

    private void productsBindingSource_BindingComplete(object sender, BindingCompleteEventArgs e)
        {
            // Check if the data source has been updated, 
            // and that no error has occured.
            if (e.BindingCompleteContext == BindingCompleteContext.DataSourceUpdate && e.Exception == null)
            {
                // End the current edit.
                e.Binding.BindingManagerBase.EndCurrentEdit();
            }
        }
person stuartd    schedule 08.03.2011
comment
К сожалению, у меня это не работает, поскольку составной элемент управления пересчитывает, что записывает другое поле обратно в источник данных, вызывая цикл. Также кажется, что фиксировать всю строку каждый раз, когда вы редактируете отдельное свойство, - это своего рода хитрость. - person John Hunter; 08.03.2011

Итак, моим решением было реализовать INotifyPropertyChanged в классе строки типизированных данных, поскольку он представлен дизайнером как частичный класс, это было довольно просто, а затем установить источник данных источника привязки как саму строку данных.

public partial class MyDataRow : INotifyPropertyChanged
{
    public void AddEventHandler()
    {
        this.Table.ColumnChanged += new System.Data.DataColumnChangeEventHandler(Table_ColumnChanged);
    }

    void Table_ColumnChanged(object sender, System.Data.DataColumnChangeEventArgs e)
    {
        OnPropertyChanged(e.Column.ColumnName);
    }
    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion
}

Код для привязки данных

MyDataRow row = <Get Current Row>;
row.AddEventHandler();
bindingSource1.DataSource = row;
person John Hunter    schedule 09.03.2011