时间:2019-03-17 标签:c#DatabindingsNull-ValueIssue

标签 c# winforms data-binding

当涉及到 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,然后处理 FormatParse 事件。将数据从数据源传递到控件时会引发 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/

相关文章:

c# - 如何以标准方式返回数据?

c# - 基类可以包含对其子类之一的引用吗?

c# - 创建返回值的自定义对话框的最简单方法?

javascript - 使用 AngularJS 1.x 使用 Object.observe 代替脏检查

javascript - KnockoutJS 选项绑定(bind) : display only non-empty items

c# - 根据字符串生成 key 对

c# - 集成测试(纯文本文件填充数据库)

c# - 国际化 HelloWorld 程序 .NET

c# - 按 Enter 时停止 'Ding'

Android RoboBinding firePropertyChange() 未定义错误