将复选框绑定到可空的整型值
本文关键字:整型 复选框 绑定 | 更新日期: 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";
}
}
如果我创建两个复选框控件(分别为chkNullableValue
和chkNonNullableValue
),我可以将它们绑定到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类型时遇到了这么多麻烦,以防将来我需要在其他任何地方使用它。
首先,正确的绑定配置适用于int
和int?
:
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
)转换为数据源值(int
或int?
),而将其转换为string
。因为默认的bool
到int
的转换,反之亦然,完全按照你想要的工作,我刚刚删除了自定义Format
和Parse
。