将复选框绑定到可空的整型值

本文关键字:整型 复选框 绑定 | 更新日期: 2023-09-27 18:15:29

我想知道在Winforms中绑定CheckBox时是否有一种处理int类型的可空值的方法。

使用下面的示例类:

public class TestClass
{
    public Nullable<int> NULLABLE_INT_VALUE { get; set; }
    public int NON_NULLABLE_VALUE { get; set; }
}

我有一个继承自标准复选框的组件,允许你传递一个对象(即类实例)和一个属性名,并将对复选框设置一个DataBinding:

public void FSetDataBinding(object BindingObject, string FieldName)
{
    Binding ControlBinding = new Binding("Checked", BindingObject, FieldName) { NullValue = false };
    ControlBinding.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
    ControlBinding.Format += (s, e) => { e.Value = e.Value.ToString() == "1"; };
    ControlBinding.Parse += FormDBCheckBox_Parse;
    DataBindings.Add(ControlBinding);
}
private void FormDBCheckBox_Parse(object sender, ConvertEventArgs e)
{
    if((bool)(e.Value))
    {
        e.Value = "1";
    }
    else
    {
        e.Value = "0";
    }
}

如果我创建两个复选框控件(分别为chkNullableValuechkNonNullableValue),我可以将它们绑定到TestClass(我们在这里假设TestClass是数据库表的EF版本:

TestClass IAmATest = new TestClass() { NULLABLE_INT_VALUE = 1, NON_NULLABLE_VALUE = 0 }
chkNullableValue.FSetDataBinding(IAmATest, "NULLABLE_INT_VALUE");
chkNonNullableValue.FSetDataBinding(IAmATest, "NON_NULLABLE_VALUE");

两个属性来自同一个对象,并且以完全相同的方式绑定;但是,当我尝试选中绑定到可空值的框时,由于某种原因,(set;)访问器从未命中该属性。实际情况是,在表单上,方框似乎被选中了;然而,由于针对框的底层属性没有更新,下一次它为显示格式化控件时,e.Value仍然是"0",框将"取消选中"自己。这也意味着调用SaveChanges()不会更新该值,因为从技术上讲它从未被更新过。

这里还需要注意的是:是的,NullValue = false与创建的Binding是对的;然而,在这个特定的情况下,可空值已经有一个"0"的值,因此实际上永远不会是null(但它可以在其他情况下)。

对于non-nullable属性则相反,它的行为完全符合我的期望;当你选中表单上的复选框时,NON_NULLABLE_VALUE的值被更新并设置为"1"作为FormDBCheckBox_Parse的一部分,所以下次控件格式化时,ControlBinding.Format返回"true",并相应地设置选中的属性。

因为我认为,如果什么是一个标志(因此无论是"关闭"或"打开"在任何时候)那么空值不应该被允许对数据库中的字段,所以最后我只是使值不可空;然而,我想确切地理解为什么我在使用nullable类型时遇到了这么多麻烦,以防将来我需要在其他任何地方使用它。

将复选框绑定到可空的整型值

首先,正确的绑定配置适用于intint?:

public void FSetDataBinding(object BindingObject, string FieldName)
{
    Binding ControlBinding = new Binding("Checked", BindingObject, FieldName, true) { DataSourceNullValue = false };
    ControlBinding.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
    DataBindings.Add(ControlBinding);
}

注意事项:

  • 始终将Binding.FormattingEnabled属性设置为true(通过使用上面的构造函数重载或属性setter)。它修复了一些旧的数据绑定错误,这些错误是为了"向后兼容"而保留的——不幸的是,这是默认的。

  • 与文档相反,NullValue是在设置数据源值之前转换为null的控制值。DataSourceNullValue是当数据源值为null或空时设置给控件的值。因此,您需要使用后者,否则,当您取消选中绑定到nullable int的复选框时,该属性将被设置为null

  • 您的Parse方法不正确。在您的情况下,它应该将控制值(bool)转换为数据源值(intint?),而将其转换为string。因为默认的boolint的转换,反之亦然,完全按照你想要的工作,我刚刚删除了自定义FormatParse