2

.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プロパティにデータバインドする別のコントロールにも同様の手法を使用しており、そのコントロールは問題なく機能します。)

4

1 に答える 1

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

ここでは、文字列「Nothing」が問題になります。これはVB.NET固有のキーワードであり、VB.NETコンパイラのみがそれが何を意味するかを知っています。.NET Frameworkバインディングコードは、「Nothing」について何も知らない型コンバーターを使用します。

Decimalのデフォルト値なので、削除するだけですか?すでに何もありません。

于 2012-05-28T20:58:39.063 に答える