我编写了一个.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属性,并且该控件运行正常。)
答案 0 :(得分:3)
<DefaultValue(GetType(Decimal?), "Nothing")>
字符串“Nothing”是这里的问题。这是一个VB.NET特定的关键字,只有VB.NET编译器知道这意味着什么。 .NET框架绑定代码使用的类型转换器对“Nothing”一无所知。
只是删除它,因为Decimal的默认值?已经没什么了。