我有一个自定义的NumericEditor控件,它具有一个名为Value的可为空的Decimal属性。当我将数据字段绑定到Value时,我想检索绑定的数据的基础类型,这样如果源字段是整数数据类型,我可以限制使用小数位。
我想我必须在BindingContextChanged事件中执行此操作,但是如何从绑定本身获取数据字段的类型?我的Google-Fu目前正在让我失望。
简而言之,我正在寻找以下问题中提到的GetValueType
方法:Simple databinding - How to handle bound field/property change. Winforms, .Net
我想如果Value属性是Object,这个方法也会很方便。
答案 0 :(得分:0)
您需要确定绑定上下文并对其进行导航,因为可能存在多个绑定,并且您显然没有获得已更改的信息。像这样:
DirectCast(sender, Control).BindingContext.Item(dataSet, "dataMember").Bindings.Item(0).DataSource.GetType()
答案 1 :(得分: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时进行检查,确保如果开发人员的设置仍然有效,则不会覆盖它们。)