.net - 取消数据绑定(bind)控件验证事件不会抑制更新数据源的尝试

标签 .net vb.net winforms validation data-binding

对于绑定(bind)到业务对象中的整数属性的 TextBox,我没有得到预期的行为。

这是我所做的:

(1) 设置DataSourceUpdateMode ,对于文本框:OnValidation .

(2) 在Validating文本框的事件,设置 e.Cancel = True如果 Integer.TryParse 失败。

(3) 添加处理程序到Binding.ParseBinding.BindingComplete并在处理程序中放置断点。

运行应用程序,将“asdasd”放入 TextBox 并跳出。
尽管设置 e.Cancel = True , ParseBindingComplete事件都被引发。
根据文档,设置 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/

相关文章:

.net - 如何解决 .NET Webbrowser 控件中的内存泄漏问题?

.net - 将表单的一个实例的 TextBox 控件的更改值更新到所有实例

vb.net - 在 WinRT、Windows8(10) 应用程序中获取 Windows 版本

c# - 我需要在 Visual C# 或更好的建议中创建一个输入对话框?

c# - LINQ to XML 不返回任何结果

c# - 删除属性 = myValue 的列表项

asp.net - 在 WCF 中实例化一个类

c# - richtextbox 中每个单词的额外信息- richtextbox 和 sql 表之间的链接

c# - 更改设计器时控件的属性未正确更新

c# - Visual Studio - 继承控件的新 "default"属性值