C# 不带BindingSource的CurrencyManager控件绑定

C# 不带BindingSource的CurrencyManager控件绑定,c#,data-binding,bindingsource,datarow,currencymanager,C#,Data Binding,Bindingsource,Datarow,Currencymanager,我决定不使用bindingSource类,而是在我的windows窗体应用程序上实现绑定功能。我在某些方面取得了成功,但没有发生什么复杂情况。我想找出原因。 我从datasource和三个控件中填充了DataTable:textbox1、textbox2、checkedBox1。 我设法绑定控件,并通过以下方式显示值: txtBox1.DataBindings.Add("Text", myTable, "NAME", true, DataSourceUpdateMode.Never); 正如您

我决定不使用bindingSource类,而是在我的windows窗体应用程序上实现绑定功能。我在某些方面取得了成功,但没有发生什么复杂情况。我想找出原因。 我从datasource和三个控件中填充了DataTable:textbox1、textbox2、checkedBox1。 我设法绑定控件,并通过以下方式显示值:

txtBox1.DataBindings.Add("Text", myTable, "NAME", true, DataSourceUpdateMode.Never);
正如您所猜测的,myTable是包含从数据库表填充的数据的datatable。 我可以使用CurrencyManager获取当前行值,例如

DataRow dr = ((DataRowView)this.BindingContext[myTable].Current).Row;
但当我想使用当前行更改值时,在第一个字段集之后,其他字段会自动更改为先前的值。我的意思是:

dr["NAME"]= textBox1.Text;


dr["SURNAME"] = textBox2.Text;  //this set seems useless
第一次赋值有效,但随后表单控件会在编辑开始之前将textBox2、checkBox1的值更改回原始值。因此,我无法以这种方式更新整行。
另一方面,使用BindingSource,我将获得与当前行类似的样式:

DataRow drB = ((DataRowView)bindingSource1.Current).Row;
并通过以下方式更改此行的字段:

drB["NAME"] = textBox1.Text;
drB["SURNAME"] = textBox2.Text;
drB["ACTIVE"] = checkBox1.Checked;
以以下内容结束编辑:

bindingSource1.EndEdit();
所有表都已准备好更新,因为整行已成功更改。 我希望看到区别,并在不使用bindingSource的情况下管理它。 这是否意味着我应该使用EndEdit()的功能?
我错过了什么,还是忘记了困扰?

在第一次更改(
dr[“NAME”]=textBox1.Text;
)之后,
OnPropertyChanged
/
OnListChanged
从绑定中提升。第二个文本框和复选框收听此消息并正在更新这些值,但这些值都是旧值。

正确答案已经显示出来,因为我错过了一点提示。这是在直接从控制值更改datarow字段之前使用临时变量。因此,即使控制值更改回其原始值,我们也可以再次实现更改整行字段,从而最终将控制值更改为新值。即:

string s1 = textBox1.Text;
string s2 = textBox2.Text;
bool b1 = checkBox1.Checked;
dr["NAME"] = s1;
dr["SURNAME"] = s2;
dr["ACTIVE"] = b1;
然而,使用这些temp变量,控制值在第一次赋值后发生了变化,最后都使用了新值。

如果有人需要,祝你好运。

好的,但是我能做些什么来达到我的目的呢?我们如何防止控件更新其值?有什么建议吗?DataTable没有RaiseListChangedEvent属性。您可以创建自己的DataTable并添加此属性。如果属性为true,则重写OnPropertyChanged方法并停止它。另一种方法是将值放入变量中并用它们进行解析。他们不会改变。在分析时,您应该挂起布局,否则用户将看到所有更改。除了您的建议之外,我还尝试了DataRowView并对其进行了更改,然后调用了this.BindingContext[myTable].EndCurrentEdit();够了。希望这不是个坏主意。不,这很好。在后台,同样的事情也会发生,就像您将值保存到变量,并将值从变量保存到当前行一样。我想知道您不使用BindingSource实际要解决的问题是什么?这仅仅是一个挖掘数据绑定机制内部工作原理的问题吗?