.net – 取消数据绑定控件验证事件不会抑制尝试更新数据源

我没有得到我希望绑定到业务对象中的整数属性的TextBox的行为.

这是我做的:

(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成功完成.

添加对CancelEdit的调用似乎有所不同.
private void textBox1_Validating(object sender,CancelEventArgs e)
    {
        bindingSource1.CancelEdit();
        e.Cancel = true;
    }

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...