使用CurrencyManager控制绑定而不使用BindingSource

时间:2011-08-17 12:58:03

标签: c# data-binding bindingsource datarow currencymanager

我决定不使用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()的功能? 我错过了什么,或忘记了这种迷恋?

2 个答案:

答案 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;

使用这些临时变量,但是控制值在首次分配后会发生变化,最后它们都会使用新值 如果有人需要,祝你好运。