UltraGridRowEditTemplate的无法写入UltraGridCellProxy的Text值的小Bug

使用程序代码是无法更改UltraGridRowEditTemplate上的UltraGridCellProxy的Text值的。正确的做法应该是,从UltraGrid中,获取ActiveRow,然后通过修改对应Cell的值来实现值的更改。例子:

this.ultraGrid1.ActiveRow.Cells["示例"].Value = "设定值";

官网网址:

http://www.infragistics.com/community/forums/t/60758.aspx?PageIndex=1

我是从这个地址中的官方答复中,得到这种方法的。但是,用这个方法,有一个需要注意的问题,官方没有提:

首先,UltraGridRowEditTemplate.CommitChanges() 是把UltraGridRowEditTemplate上的控件的值,提交给数据源,然后数据源通知UltraGrid,UltraGrid才能显示出更改后的结果。

其次,如果对UltraGrid的Cell的值进行修改,修改后,这个修改会立即被提交给数据源,然后数据源会立即通知UltraGridRowEditTemplate,UltraGridRowEditTemplate会把这个更改,覆盖到UltraGridRowEditTemplate上的控件。

OK,问题来了:

假设UltraGridRowEditTemplate上的TextBox的Text是“123”,现在,执行下面的代码:

TextBox.Text = "ABC";//把Text值更改为"ABC"
this.ultraGrid1.ActiveRow.Cells["示例"].Value = "已经更改为ABC";
UltraGridRowEditTemplate.CommitChanges();//提交更改

这3行代码执行后,TextBox.Text = ? ,答案是"123“,也就是Text没有被改为"ABC"。

原因:

    TextBox.Text = "ABC";//更改之后,虽然Text值的确被更改为"ABC",但这个更改并没有通知给数据源,因此,此时数据源中,这个绑定值仍然是"123"

    this.ultraGrid1.ActiveRow.Cells["示例"].Value = "已经更改为ABC";//更改UltraGrid的Cell后,这个更改会立即通知数据源,然后数据源通知UltraGridRowEditTemplate,UltraGridRowEditTemplate会把数据源中的值重新覆盖到UltraGridRowEditTemplate上的所有绑定的控件里。因此,数据源中,TextBox的Text的旧值”123"就被覆盖回来了。这也就是为什么"ABC"的更改没有成功的原因。

    UltraGridRowEditTemplate.CommitChanges();//这时再做提交,实际上已经没有意义了。

    因此,正确的做法是,如果涉及到绑定控件的值修改,一定要修改一个,立即提交一次。如果一个控件值的修改,会触发其他关联控件的值的修改,那么,应该先提交当前控件的修改值,然后才轮到别的控件的值的修改。别的控件的值修改后,也是需要立即提交的。步骤:主控件值修改 -> 提交 -> 关联控件值修改 -> 提交 -> 再关联控件值的修改 -> 提交  .... ,总而言之,一个控件的值被修改后,应该在别的控件或数据源的值发生变化前提交。

    所以,上述代码应该修改为:

TextBox.Text = "ABC";
UltraGridRowEditTemplate.CommitChanges();
this.ultraGrid1.ActiveRow.Cells["示例"].Value = "已经更改为ABC";
原文地址:https://www.cnblogs.com/xxxteam/p/2892241.html