这是我做的:
(1)将TextBox的DataSourceUpdateMode设置为:OnValidation.
(2)在TextBox的Validating事件中,如果Integer.TryParse失败,则设置e.Cancel = True.
(3)向Binding.Parse和Binding.BindingComplete添加一个处理程序,并在处理程序中放置断点.
运行应用程序,将“asdasd”放在TextBox和tab中.
尽管设置e.Cancel = True,但Parse和BindingComplete事件都被引发.
根据文档,设置e.Cancel = True应该抑制任何进一步的逻辑.
我搜索了MSDN,找出为什么会发生这种情况,但我找不到任何东西.有没有人知道我在哪里可以得到一些细节?
ETA:我还为Validated事件添加了一个句柄.这是事件的顺序:
数据不好:
(1)验证. (我设置e.Cancel = True)
(2)解析
(3)BindingComplete
好数据:
(1)验证
(2)解析
(3)BindingComplete
(4)经过验证
ETA2:更多信息和解决方法.
此行为的问题是,如果您有一些未在属性设置器中实现的验证.
例如,假设我的整数属性必须是奇数.我没有在属性设置器中检查这个,所以我在验证事件中进行检查.
如您所见,从上面的行为来看,即使我取消验证,作为合法整数的值也将被写入数据源.
尽管数据源已更新,但如果您在验证事件中设置了“取消”,则不会触发Validated事件,因此您仍然可以阻止用户继续进行.
变通::
要停止数据源更新,您需要在Binding.Parse事件中进行验证,并抛出异常 – 这会阻止Binding成功完成.
private void textBox1_Validating(object sender,CancelEventArgs e) { bindingSource1.CancelEdit(); e.Cancel = true; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。