当涉及到 null
值时,我们在数据绑定(bind)方面遇到了一些问题。
例如,复选框的数据绑定(bind)如下所示:
public void DataBindLambda<T>(IDBEntity entity, Expression<Func<T>> propertyLambda)
{
this.DataBindings.Add("Checked", entity, CodeUtils.GetPropertyName(propertyLambda), true, DataSourceUpdateMode.OnPropertyChanged);
}
现在,如果实体的字段可为空(在数据库中),则绑定(bind)将失败,并显示 System.FormatException: 'Value '' 无法转换为类型 'Boolean'。'
到目前为止这是可以理解的,为了消除该错误,我们可以将 null 值处理为 false:
public void DataBindLambda<T>(IDBEntity entity, Expression<Func<T>> propertyLambda)
{
this.DataBindings.Add("Checked", entity, CodeUtils.GetPropertyName(propertyLambda), true, DataSourceUpdateMode.OnPropertyChanged, false);
}
这适用于 95% 的复选框,我们可以将 null
处理为 false
- 但是现在我们有一个边缘情况,这不起作用:
数据库值反射(reflect)了批准的状态:
null
尚未决定,审批者必须批准false
未获批准true
已获得批准。
在这种情况下,将 null
处理为 false
的逻辑显然会导致不期望的结果。
它可以通过其他方式解决,但由于空值是数据绑定(bind)(日期、数字、 bool 值)反复出现的问题,我想知道这通常是如何解决的?
有没有一种方法可以仅以一种方式应用null
-替换?
即说“如果数据库值为 null,则将其视为 false。如果选择 false,则将 false 应用于数据模型(而不是 DB_NULL
)
最佳答案
如果数据可为空,则将控件的 ThreeState
属性设置为 true
并绑定(bind)到 CheckState
属性而不是 已检查
。在这种情况下,您必须在 DataTable
中可为空的 bool
数据与控件中的 CheckState
值之间进行转换。为此,您需要在绑定(bind)(您所在的位置)上将 FormattingEnabled
设置为 true
,然后处理 Format
和 Parse
事件。将数据从数据源传递到控件时会引发 Format
:
if (e.Value == DBNull.Value)
{
e.Value = CheckState.Indeterminate;
}
else
{
e.Value = (bool)e.Value ? CheckState.Checked : CheckState.Unchecked;
}
将数据从控件传递到数据源时会引发 Parse
:
switch ((CheckState)e.Value)
{
case CheckState.Checked:
e.Value = true;
break;
case CheckState.Unchecked:
e.Value = false;
break;
case CheckState.Indeterminate:
e.Value = DBNull.Value;
break;
}
关于时间:2019-03-17 标签:c#DatabindingsNull-ValueIssue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75170968/