Winforms 在UI中数据绑定多个字段不更新
我有一个winform,它包含一个bindingsource,其数据源是一个类型化数据集。我在designer中将两个文本框绑定到同一列。当我更新任一文本框时,数据集中的DataRow列被正确更新,但表单上的其他文本框值未被更新 我错过了什么?如何获取数据绑定以更新第二个文本框 注意:这是一个简化的示例,我需要这样做,因为在实际应用程序中,一个控件可由用户编辑,另一个是输入到复合控件中进行计算Winforms 在UI中数据绑定多个字段不更新,winforms,data-binding,dataset,Winforms,Data Binding,Dataset,我有一个winform,它包含一个bindingsource,其数据源是一个类型化数据集。我在designer中将两个文本框绑定到同一列。当我更新任一文本框时,数据集中的DataRow列被正确更新,但表单上的其他文本框值未被更新 我错过了什么?如何获取数据绑定以更新第二个文本框 注意:这是一个简化的示例,我需要这样做,因为在实际应用程序中,一个控件可由用户编辑,另一个是输入到复合控件中进行计算 // Taken from InitializeComponent() this.productsBi
// 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=行;
不幸的是,这对我不起作用,因为复合控件会重新计算,将不同的字段写回数据源,从而导致循环。而且,每次编辑单个属性时提交整行内容感觉有点像黑客。