winforms c#数据绑定空值问题

wfypjpf4  于 2023-01-21  发布在  C#
关注(0)|答案(1)|浏览(252)

我们有一些问题与数据绑定,当它归结为null-值。
例如,与复选框的数据绑定如下所示:

public void DataBindLambda<T>(IDBEntity entity, Expression<Func<T>> propertyLambda)
  {
      this.DataBindings.Add("Checked", entity, CodeUtils.GetPropertyName(propertyLambda), true, DataSourceUpdateMode.OnPropertyChanged);
  }

现在,如果实体的字段可以为空(在数据库中),则绑定失败,返回System.FormatException: 'Value '' cannot be converted to type 'Boolean'.'
到目前为止,这是可以理解的,为了消除该错误,我们可以将空值处理为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处理,但现在我们遇到了一个边缘情况,这不起作用:
数据库值反映要给予的批准状态:

  • null尚未决定,批准人必须批准
  • false未获得批准
  • true已批准。

在这种情况下,将null处理为false的逻辑显然会导致不希望的结果。
它可以用其他方法解决,但是由于空值是数据绑定(日期、数值、布尔值)的一个反复出现的问题,我想知道通常如何解决这个问题?
是否有办法只以一种方式应用null-替换?例如,说“如果数据库值为空,则认为它为假。如果选择了假,则将假应用于数据模型(而不是DB_NULL)”

thtygnil

thtygnil1#

如果数据可以为空,则将控件的ThreeState属性设置为true,并绑定到CheckState属性而不是Checked。在这种情况下,您必须在DataTable中可以为空的bool数据和控件中的CheckState值之间进行转换。为此,您需要在绑定上将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;
}

相关问题