DataBinding为null属性值的NumericUpDown控件不起作用

本文关键字:NumericUpDown 控件 不起作用 null 属性 DataBinding | 更新日期: 2023-09-27 18:22:34

我有一个方法,可以设置一个上下数字来显示对象中属性的值。该属性值可以是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

DataBinding为null属性值的NumericUpDown控件不起作用

编辑

您可以简单地设置:

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; }
}