我使用数据绑定在C#Windows窗体客户端的文本框中显示值。当用户单击“保存”时,我会将更改保留到数据库中。但是,将忽略活动编辑器中的新值(保存以前的值)。如果我跳出活动编辑器,然后保存,则新值将保持不变,如预期的那样。
有没有办法在持久化之前强制主动控件接受它的值?
答案 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之前,尝试将焦点从活动编辑器(通过将焦点设置为其他内容,例如保存按钮)设置为按钮事件。