привязка данных нескольких полей в интерфейсе не обновляется - PullRequest
0 голосов
/ 08 марта 2011

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

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

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

// 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);

Ответы [ 2 ]

1 голос
/ 08 марта 2011

На 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();
            }
        }
0 голосов
/ 09 марта 2011

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

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...