数据绑定Windows窗体控件在失去焦点之前无法识别更改

时间:2009-06-29 19:36:22

标签: c# winforms data-binding

我使用数据绑定在C#Windows窗体客户端的文本框中显示值。当用户单击“保存”时,我会将更改保留到数据库中。但是,将忽略活动编辑器中的新值(保存以前的值)。如果我跳出活动编辑器,然后保存,则新值将保持不变,如预期的那样。

有没有办法在持久化之前强制主动控件接受它的值?

3 个答案:

答案 0 :(得分:5)

如果你可以获得与输入相对应的Binding实例(TextBox),你可以调用WriteValue method来强制控件中的值到它绑定的对象到。

此外,您可以致电EndCurrentEdit method {通常是BindingManagerBase class个实例)上的CurrencyManager class来完成修改,但这需要ICancelAddNew或{{的实施3}}绑定到的对象上的接口(并且不需要捕获绑定)。

答案 1 :(得分:3)

我使用的解决方案是在实际保存数据库记录之前,在Save事件(调用)上调用Form上的ValidateChildren。这会强制验证所有字段,从而在不失去当前正在表单上编辑的控件的焦点的情况下进行绑定。如果保存按钮位于Windows菜单系统上而不是自身形式,则非常方便 - 如果表单上任何控件中的数据无效,则返回False,因此可用于防止保存错误数据。

这也解决了当OnPropertyChanged用作绑定方法而不是OnValidation时发生的绑定字段的不一致更新。此外,如果绑定方法设置为Never,并且对每个控件捕获的每个经过验证的事件进行单独的WriteValue调用,则至关重要。

答案 2 :(得分:2)

这是一种黑客攻击,但在调用save之前,尝试将焦点从活动编辑器(通过将焦点设置为其他内容,例如保存按钮)设置为按钮事件。