我有一个方法可以设置数字向下以显示对象中属性的值。该属性值可以是null
。如果是这种情况,我希望数字向下显示为零。这是我使用的代码:
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
的对象调用此绑定,则控件仍显示原始值。
顺便说一句,如果对象实际上在属性中有值,则此方法可以正常工作。
我错过了什么?
编辑:我应该注意这是对象属性中的null
而不是DBNull.Value
。
答案 0 :(得分:2)
修改强>
您可以设置:
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; }
}