2012-05-28 1 views
2

У меня есть настраиваемый элемент управления NumericEditor, который имеет свойство Nimeable Decimal, называемое Value. Когда я привязываю поле данных к Value, я хотел бы получить базовый тип данных, привязанных к нему, чтобы я мог ограничить использование десятичных знаков, если исходное поле является интегральным типом данных.Получение типа базового поля при привязке данных к свойству десятичного (или объектного)

Я полагаю, что мне нужно было сделать это в событии BindingContextChanged, но как мне получить тип поля данных из самого связывания? В настоящее время мой Google-Fu не дает мне возможности.

Короче говоря, я ищу что-то вроде GetValueType способа, указанного в следующем вопросе: Simple databinding - How to handle bound field/property change. Winforms, .Net

Я полагаю, этот метод также может быть удобно, если свойство Value был объект.

ответ

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 в случае, если разработчик уже установил эти свойства, гарантируя, что настройки разработчика не будут переопределены, если они все еще действительны.)

0

Вам нужно будет определить контекст привязки и перемещаться по нему, потому что может быть несколько привязок, и вы, по-видимому, не получаете информацию, которая была изменена. Что-то вроде этого:

DirectCast(sender, Control).BindingContext.Item(dataSet, "dataMember").Bindings.Item(0).DataSource.GetType() 
+0

Это направление, в которое я входил, но поскольку он находится в настраиваемом элементе управления, он не знает, что такое источник данных. Я верю, что ответ получен с помощью «Me.DataBindings.Item (« Значение »). BindingManagerBase.GetItemProperties', но я не смог двигаться дальше оттуда. – MCattle