【发布时间】:2016-10-28 17:32:32
【问题描述】:
我想知道在 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_VALUE 的值将更新并设置为 "1" 作为FormDBCheckBox_Parse 的一部分,因此下次控件格式化自身时,ControlBinding.Format 返回"true" 和选中的属性相应地设置。
我认为,如果某物是一个标志(因此始终是“关闭”或“开启”),则不应允许空值针对数据库中的字段,因此最后我只是使值不可为空;但是,我想确切地了解为什么我在使用可空类型时遇到这么多麻烦,以防我将来需要将它用于其他任何事情。
【问题讨论】:
标签: c# entity-framework checkbox data-binding