2015-11-19 3 views
1

У меня есть метод, который устанавливает число вверх, чтобы отобразить значение свойства в объекте. Это значение может быть null. Я хочу, чтобы числовое значение вниз отображалось равным нулю, если это так. Это код, я использую:Управление NumericUpDown с DataBinding с нулевым значением свойства не работает

private void NudNullBindingSetup(NumericUpDown nud, MyObject obj, string propertyName) 
    { 
     var b = new Binding("Value", obj, propertyName, true, 
          DataSourceUpdateMode.OnPropertyChanged) 
     { 
      NullValue = 0, 
      DataSourceNullValue = null 
     }; 
     nud.DataBindings.Add(b); 
    } 

Если я ставлю значение в NumericUpDown, а затем вызвать эту связь с объектом, который имеет null для свойства, управление по-прежнему отображает исходное значение.

BTW, этот метод работает отлично, если объект фактически имеет значение в свойстве.

Что я пропустил?

Редактировать: Я должен отметить, что это null, а не DBNull.Value в свойстве объекта.

+0

ли вы установили 'NumericUpDown.Minimum'property? – Graham

+0

Проверьте правильность! –

ответ

2

EDIT

Вы можете просто установить:

NullValue = (decimal)0, 
DataSourceNullValue = null 

И это работает, как ожидалось.

Оригинал

Вы можете использовать Format событие, чтобы решить эту проблему.

Событие Format возникает, когда данные передаются из источника данных в элемент управления. Вы можете обрабатывать событие Format для преобразования неформатированных данных из источника данных в форматированные данные для отображения.

К примеру, вот что я писал и работает, как ожидается, в этом вопросе:

private void NudNullBindingSetup(NumericUpDown nud, MyObject obj, string propertyName) 
{ 
    var b = new Binding("Value", obj, propertyName, true, DataSourceUpdateMode.OnPropertyChanged); 
    b.NullValue = 0;    /*Only used in Format event*/ 
    b.DataSourceNullValue = null; /*Only used in Format event*/ 
    b.Format += (s, e) => 
    { 
     var binding = (Binding)s; 
     var control = (NumericUpDown)binding.Control; 

     control.Value = 
      e.Value == binding.DataSourceNullValue ? 
       (int)binding.NullValue : ((int?)e.Value).Value; 
    }; 
    nud.DataBindings.Add(b); 
} 

А вот MyObject

public class MyObject 
{ 
    public int? Value { get; set; } 
} 
Смежные вопросы