我决定不使用bindingSource类,而是在我的Windows窗体应用程序上实现绑定功能。我成功了一些点,但很少出现并发症。我想找出原因。 我从数据源和三个控件填充了DataTable: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()的功能? 我错过了什么,或忘记了这种迷恋?
答案 0 :(得分:0)
第一次更改后(dr["NAME"]= textBox1.Text;
)OnPropertyChanged
/ OnListChanged
从绑定中引发。第二个文本框和复选框听取此消息并正在更新那些值,但这些值是旧值。
答案 1 :(得分:0)
正确答案已经显现出来,因为我错过了一点提示。那是在直接从控件值更改datarow字段之前使用临时变量。因此,即使控制值更改回其原始值,我们也可以再次更改整行字段,从而最终将值控制为新值。即:
string s1 = textBox1.Text;
string s2 = textBox2.Text;
bool b1 = checkBox1.Checked;
dr["NAME"] = s1;
dr["SURNAME"] = s2;
dr["ACTIVE"] = b1;
使用这些临时变量,但是控制值在首次分配后会发生变化,最后它们都会使用新值 如果有人需要,祝你好运。