将Int32字段数据绑定到可为空的Decimal属性时抛出CLR FormatException

时间:2012-05-28 19:21:43

标签: .net vb.net winforms data-binding nullable

我编写了一个.Net 4.0 Winforms数字编辑器控件(继承自TextBox),我添加了一个可以为空的十进制类型的Value属性,如下所示:

Public Class NumericEditor
    Inherits TextBox

    Private _value As Decimal? = Nothing

    <DefaultValue(GetType(Decimal?), "Nothing"), Bindable(True)>
    Public Property Value() As Decimal?
        Get
           Return _value
        End Get
        Set(ByVal newvalue As Decimal?)
            _value = newvalue
        End Set
    End Property

End Class

我将DataTable字段绑定到控件的实例,如下所示:

Dim bindingNew As New Binding("Value", _bindingSource, strFieldName, True, DataSourceUpdateMode.OnValidation, Nothing)
NumericEditor1.DataBindings.Add(bindingNew)

(我已经为绑定对象创建了一个变量以帮助调试,但是在第二行引发了CLR异常。)

当将包含有效值的Int32类型的字段数据绑定到Value属性时,我收到了一个FormatException:

System.FormatException occurred
  Message=Input string was not in a correct format.
  Source=mscorlib
  StackTrace:
       at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
  InnerException: 

同样,当数据绑定包含DBNull的Int32类型的字段时,我得到了一般异常:

System.Exception occurred
  Message=Nothing is not a valid value for Decimal.
  Source=System
  StackTrace:
       at System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
  InnerException: System.FormatException
       Message=Input string was not in a correct format.
       Source=mscorlib
       StackTrace:
            at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
            at System.Number.ParseDecimal(String value, NumberStyles options, NumberFormatInfo numfmt)
            at System.ComponentModel.DecimalConverter.FromString(String value, NumberFormatInfo formatInfo)
            at System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
       InnerException: 

此时,我对如何解决此异常感到茫然,特别是当我将数字字段数据绑定到数字属性时,应该不会发生字符串转换。有什么想法吗?

(为了进一步复杂化,我使用类似的技术进行另一个控件,我将DateTime字段数据绑定到可以为空的DateTime属性,并且该控件运行正常。)

1 个答案:

答案 0 :(得分:3)

<DefaultValue(GetType(Decimal?), "Nothing")>

字符串“Nothing”是这里的问题。这是一个VB.NET特定的关键字,只有VB.NET编译器知道这意味着什么。 .NET框架绑定代码使用的类型转换器对“Nothing”一无所知。

只是删除它,因为Decimal的默认值?已经没什么了。