不带BindingSource的CurrencyManager控件绑定

本文关键字:控件 绑定 CurrencyManager BindingSource 不带 | 更新日期: 2023-09-27 18:05:46

我决定不使用bindingSource类,而是在我的windows窗体应用程序上实现绑定功能。我在某些方面取得了成功,但很少出现并发症。我想找出原因。我有数据表从数据源和三个控件填充:textbox1, textbox2, checkedBox1。我设法绑定控件并通过;

显示值。
txtBox1.DataBindings.Add("Text", myTable, "NAME", true, DataSourceUpdateMode.Never);

如您所料,myTable是包含从数据库表中填充的数据的数据表。我可以使用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()所做的事情?是我错过了什么,还是忘记了执念?

不带BindingSource的CurrencyManager控件绑定

在第一次更改(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;

对于这些临时变量,尽管控制值在第一次赋值后发生了变化,但最后它们都具有新值。
如果有人需要,祝你好运。