【问题标题】:How can I catch an Exception triggered by databound Control?如何捕获由数据绑定控件触发的异常?
【发布时间】:2012-04-11 20:42:09
【问题描述】:

我有一个数据绑定NumericUpDown-Control,绑定如下:

Binding b = new Binding("Value", myDataSource, "myProperty");
b.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
numericUpDown.DataBindings.Add(b);

更改myProperty 会产生一些进一步的影响,并且可能会在更远的地方抛出异常。

检查是否会抛出异常所需的一些信息在 GUI 中不可用,因此验证输入很困难。 我可以捕获由我的 DataBinding 所做的值更改触发的异常吗?或者这是一个糟糕的设计?如果是这样,我应该提供所有必要的信息以便能够正确验证输入,还是不应该使用 DataBinding 进行复杂的更改?

我将非常感谢任何帮助!

丰富

【问题讨论】:

  • 正如您所建议的,DataBinding 不应该针对复杂的属性。检索和设置属性时应进行验证。
  • 谢谢约翰。如果你写一个,我会接受这个作为答案。

标签: c# .net winforms data-binding exception-handling


【解决方案1】:

当绑定值改变导致异常时,你会发现有时候绑定会吞掉它。

为此,您可以挂钩绑定的BindingComplete 事件(您可能还需要将绑定设置为将FormattingEnabled 设置为true)。那时,绑定写入数据源时捕获的任何异常都将在事件 args 上冒泡(在它的 Exception 属性上)。问题是不幸的是,您可能会发现大部分堆栈跟踪都丢失了......

编辑:如果您使用的是 BindingSource 组件,它还会冒泡 BindingComplete 事件。因此,这可能也是捕获其他绑定引发的异常的一种更快的方法。

【讨论】:

    【解决方案2】:

    数据绑定不应该针对复杂的属性。

    在检索和设置属性时应进行验证。

    【讨论】:

    • 这是见仁见智的问题。绑定“复杂”属性(即 UDT 或枚举)对于减少样板代码量非常有用。
    • 您误解了这个问题,这是根本问题。一个复杂的属性将是一个具有大量计算和例程的属性,可能会在数据绑定期间生成异常。这应该避免 - 并且与属性本身的 TYPE 无关。
    • 可能是这样,但是作者所说的数字上/下并不是那么复杂。
    • 我会冒最后一个回复的风险,以确保未来的读者清楚。该问题询问了有关绑定自定义“myProperty”的问题,作者特别询问了如何处理该自定义属性中的异常。答:没有足够复杂的自定义属性需要抛出异常。
    猜你喜欢
    • 2011-06-19
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2016-07-09
    相关资源
    最近更新 更多