.Net 4.0 Winforms Numeric Editorコントロール(TextBoxから継承)を作成し、次のようにnull許容の10進型である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例外が2行目にスローされます。)
有効な値を含むタイプ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フィールドをnull許容のDateTimeプロパティにデータバインドする別のコントロールにも同様の手法を使用しており、そのコントロールは問題なく機能します。)