对于绑定(bind)到业务对象中的整数属性的 TextBox,我没有得到预期的行为。
这是我所做的:
(1) 设置DataSourceUpdateMode
,对于文本框:OnValidation
.
(2) 在Validating
文本框的事件,设置 e.Cancel = True
如果 Integer.TryParse 失败。
(3) 添加处理程序到Binding.Parse
和 Binding.BindingComplete
并在处理程序中放置断点。
运行应用程序,将“asdasd”放入 TextBox 并跳出。
尽管设置 e.Cancel = True
, Parse
和 BindingComplete
事件都被引发。
根据文档,设置 e.Cancel = True
应该压制任何进一步的逻辑。
我搜索了 MSDN 以找出为什么会发生这种情况,但我找不到任何东西。有谁知道我在哪里可以了解这方面的一些细节?
预计到达时间 : 我也为 Validated 事件添加了句柄。以下是事件的顺序:
不良数据:
(1) 验证。 (我设置了 e.Cancel = True
)
(2) 解析
(3) 绑定(bind)完成
好数据:
(1) 验证
(2) 解析
(3) 绑定(bind)完成
(4) 已验证
ETA2 : 更多信息和解决方法。
这种行为的问题是,如果您有一些未在属性 setter 中实现的验证。
例如,假设我的整数属性必须是奇数。我不在属性 setter 中检查这个,所以我在验证事件中进行检查。
如您所见,从上述行为来看,即使我取消验证,该值作为合法整数也会写入数据源。
尽管数据源已更新,但如果您确实在验证事件中设置了 Cancel,则不会触发 Validated 事件,因此您仍然可以阻止用户继续进行。
解决方法::
要停止数据源更新,您需要在 Binding.Parse
中进行验证事件,并引发异常 - 这会阻止绑定(bind)成功完成。
最佳答案
添加对 CancelEdit 的调用似乎有所作为。
private void textBox1_Validating(object sender, CancelEventArgs e)
{
bindingSource1.CancelEdit();
e.Cancel = true;
}
关于.net - 取消数据绑定(bind)控件验证事件不会抑制更新数据源的尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1661343/