1

我决定不使用 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() 所做的事情?我错过了什么,或者忘记了痴迷?

4

2 回答 2

0

在第一次更改后 ( dr["NAME"]= textBox1.Text;) OnPropertyChanged/OnListChanged从绑定中引发。第二个文本框和复选框收听此消息并更新那里的值,但这些值是旧值。

于 2011-08-17T13:29:51.057 回答
0

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

string s1 = textBox1.Text;
string s2 = textBox2.Text;
bool b1 = checkBox1.Checked;
dr["NAME"] = s1;
dr["SURNAME"] = s2;
dr["ACTIVE"] = b1;

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

于 2011-08-19T06:58:01.510 回答