2

Valueと呼ばれるnull許容のDecimalプロパティを持つカスタムNumericEditorコントロールがあります。データフィールドをValueにバインドするときに、バインドされているデータの基になるTypeを取得して、ソースフィールドが整数データ型の場合に小数点以下の桁数の使用を制限できるようにします。

BindingContextChangedイベントでこれを行う必要があると思いますが、バインディング自体からデータフィールドのタイプを取得するにはどうすればよいですか?私のGoogle-Fuは現在私を失敗させています。

要するに、私はGetValueType次の質問で言及されている方法のようなものを探しています: 単純なデータバインディング-バインドされたフィールド/プロパティの変更を処理する方法。Winforms、.Net

ValueプロパティがObjectの場合、このメソッドも便利だと思います。

4

2 に答える 2

0

複数のバインディングが存在する可能性があり、どのバインディングが変更されたかについての情報を取得していないように見えるため、バインディングコンテキストを決定してナビゲートする必要があります。このようなもの:

DirectCast(sender, Control).BindingContext.Item(dataSet, "dataMember").Bindings.Item(0).DataSource.GetType()
于 2012-05-29T06:52:40.823 に答える
0

私は次の解決策を思いついた:

Private Sub NumericEditor_BindingContextChanged(sender As Object, e As EventArgs) Handles Me.BindingContextChanged
   If DataBindings.Count > 0 AndAlso DataBindings.Item("Value") IsNot Nothing Then
      Dim myPropDescs As PropertyDescriptorCollection = DataBindings.Item("Value").BindingManagerBase.GetItemProperties
      Dim propertyName As String = DataBindings.Item("Value").BindingMemberInfo.BindingField
      Dim bindingType As Type = myPropDescs.Find(propertyName, False).PropertyType

      Select Case bindingType
         Case GetType(SByte)
            DecimalPlaces = 0
            MinimumValue = SByte.MinValue
            MaximumValue = SByte.MaxValue
         Case GetType(Byte)
            DecimalPlaces = 0
            MinimumValue = Byte.MinValue
            MaximumValue = Byte.MaxValue
         Case GetType(Int16)
            DecimalPlaces = 0
            MinimumValue = Int16.MinValue
            MaximumValue = Int16.MaxValue
         Case GetType(UInt16)
            DecimalPlaces = 0
            MinimumValue = UInt16.MinValue
            MaximumValue = UInt16.MaxValue
         Case GetType(Int32)
            DecimalPlaces = 0
            MinimumValue = Int32.MinValue
            MaximumValue = Int32.MaxValue
         Case GetType(UInt32)
            DecimalPlaces = 0
            MinimumValue = UInt32.MinValue
            MaximumValue = UInt32.MaxValue
         Case GetType(Int64)
            DecimalPlaces = 0
            MinimumValue = Int64.MinValue
            MaximumValue = Int64.MaxValue
         Case GetType(UInt64)
            DecimalPlaces = 0
            MinimumValue = UInt64.MinValue
            MaximumValue = UInt64.MaxValue
         Case GetType(Single), GetType(Double), GetType(Decimal)
            MinimumValue = Decimal.MinValue
            MaximumValue = Decimal.MaxValue
      End Select
   End If
End Sub

少し繰り返しなので、それほどエレガントではありませんが、機能します。(私の実際のコードには、開発者がすでにこれらのプロパティを設定している場合に、MinimumValueとMaximumValueを設定するときにもチェックがあり、開発者の設定がまだ有効である場合にオーバーライドされないようにします。)

于 2012-05-29T19:02:19.630 に答える