2

我有一个自定义 NumericEditor 控件,它有一个名为 Value 的可为空的 Decimal 属性。当我将数据字段绑定到值时,我想检索绑定数据的基础类型,以便在源字段是整数数据类型时限制小数位的使用。

我想我必须在 BindingContextChanged 事件中执行此操作,但是如何从绑定本身获取数据字段的类型?我的 Google-Fu 现在让我失望了。

简而言之,我正在寻找类似于GetValueType以下问题中提到的方法: 简单数据绑定 - 如何处理绑定字段/属性更改。Winforms,.Net

我想如果 Value 属性是一个对象,这种方法也会很方便。

4

2 回答 2

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 回答
0

您将需要确定绑定上下文并对其进行导航,因为可能存在多个绑定,而您显然没有获得哪一个已更改的信息。像这样的东西:

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