C# EF:将复选框数据绑定到可为null的int值

C# EF:将复选框数据绑定到可为null的int值,c#,entity-framework,checkbox,data-binding,C#,Entity Framework,Checkbox,Data Binding,我想知道当绑定到Winforms中的复选框时,是否有一种方法可以处理类型为int的可空值 以下面的示例类为例: public class TestClass { public Nullable<int> NULLABLE_INT_VALUE { get; set; } public int NON_NULLABLE_VALUE { get; set; } } 如果我创建两个复选框控件(chkNullableValue和chknNullableValue),我可以将它

我想知道当绑定到Winforms中的
复选框时,是否有一种方法可以处理类型为
int
的可空值

以下面的示例类为例:

public class TestClass
{
    public Nullable<int> NULLABLE_INT_VALUE { get; set; }
    public int NON_NULLABLE_VALUE { get; set; }
}
如果我创建两个复选框控件(
chkNullableValue
chknNullableValue
),我可以将它们绑定到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;)
accessor从未碰到属性。发生的情况是,在表单上,框似乎已被选中;但是,由于框的基础属性尚未更新,因此下次格式化控件以显示时,
e.Value
仍然是
“0”
并且该框本身将“取消检查”。这也意味着调用
SaveChanges()
不会更新该值,因为从技术上讲,该值从未更新过

这里还需要注意:是的,
NullValue=false
确实与创建的
绑定相冲突;但是,在这种特定情况下,可空值已经有一个值
“0”
,因此实际上永远不会是
null
(但在其他情况下可能是这样)

不可空属性的情况正好相反,其行为与我预期的完全相同;当您选中表单上的复选框时,
不可空值
的值将更新并设置为
“1”
作为
FormDBCheckBox\u Parse
的一部分,因此下次控件格式化自身时,
ControlBinding.Format
返回
“true”
,并相应地设置checked属性


因为我认为,如果某件事是一面旗帜(因此在任何时候都是“关”或“开”)然后,不允许对数据库中的字段使用null值,因此最后我只是使该值不可为null;然而,我想确切地理解为什么我在使用null类型时遇到了这么多麻烦,以防将来需要将其用于其他任何事情。

首先,正确的绑定配置适用于
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);
}
需要注意的一些事项:

  • 始终将属性设置为
    true
    (通过使用如上所述的构造函数重载或属性设置器)。它正在修复一些旧的数据绑定错误,这些错误是为“向后兼容”而保留的,很遗憾,默认情况下

  • 与文档相反,
    NullValue
    是在设置数据源值之前转换为
    null
    的控件值。而
    DataSourceNullValue
    是在数据源值为null或空时设置给控件的值。因此,只要取消选中复选框,您就需要使用后面的其他值x绑定到
    可空int
    ,属性将设置为
    null

  • 您的
    Parse
    方法不正确。它应该将控制值(
    bool
    )转换为数据源值(
    int
    int?
    )在您的例子中,当您将其转换为
    string
    时,由于默认的
    bool
    int
    转换以及反之亦然,因此我刚刚删除了自定义
    格式
    解析


非常感谢您的回答和其他解释。我再次了解了NullValue和DataSourceNullValue在绑定上代表的含义,这说明了为什么事情不起作用。我还按照您的建议设置了FormattingEnabled。此外,我需要保留解析和格式化过程,因为存在数据库中的一些字段是字符串,可以包含字符串值或“标志”(即设置;不是我的主意,而是meh,我必须使用它);因此,我将FSetDataBinding更改为FSetDataBinding,其中T:class允许我反映BindingObject并查找属性的类型,并且仅当属性绑定到字符串值时才添加Format/Parse,因为我仍然需要字符串的“0”和“1”值,而不是它们的文本“false”和“true”值进入DB.Ok,但至少在处理
Parse
事件时,检查属性-如果它是
typeof(string)
,然后执行
bool
string
转换,如果不是,则正确处理它或保持它的原样,以便进行默认转换。我认为没有必要这样做(也就是说,我可以保持原样),因为我已将FSetDataBinding更改为仅在绑定属性为typeof(string)的情况下添加Format和Parse事件;因此,如果不是,则永远不会调用Parse和Format,因为正如您所说,可以使用默认的bool到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);
}