Winforms 在UI中数据绑定多个字段不更新

Winforms 在UI中数据绑定多个字段不更新,winforms,data-binding,dataset,Winforms,Data Binding,Dataset,我有一个winform,它包含一个bindingsource,其数据源是一个类型化数据集。我在designer中将两个文本框绑定到同一列。当我更新任一文本框时,数据集中的DataRow列被正确更新,但表单上的其他文本框值未被更新 我错过了什么?如何获取数据绑定以更新第二个文本框 注意:这是一个简化的示例,我需要这样做,因为在实际应用程序中,一个控件可由用户编辑,另一个是输入到复合控件中进行计算 // Taken from InitializeComponent() this.productsBi

我有一个winform,它包含一个bindingsource,其数据源是一个类型化数据集。我在designer中将两个文本框绑定到同一列。当我更新任一文本框时,数据集中的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);

有一篇关于MSDN的文章可能会有所帮助-请参阅

实际上,您需要为BindingSource的
BindingComplete
事件设置一个事件处理程序(正如您所做的那样,您需要将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();
            }
        }

因此,我的解决方案是在类型化数据行类上实现INotifyPropertyChanged,因为它是由设计器作为部分类公开的。这相当简单,然后将bindingsource的数据源设置为数据行本身

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;
MyDataRow=;
row.AddEventHandler();
bindingSource1.DataSource=行;

不幸的是,这对我不起作用,因为复合控件会重新计算,将不同的字段写回数据源,从而导致循环。而且,每次编辑单个属性时提交整行内容感觉有点像黑客。