【问题标题】:Object binding to Winforms ComboBox fails when SelectedItem is null当 SelectedItem 为空时,对象绑定到 Winforms ComboBox 失败
【发布时间】:2011-03-16 00:15:17
【问题描述】:

我发现很多帖子都在回避这个话题,但没有一个真正解决这个问题。

我有一个绑定到 List<State> 的 ComboBox,其中 State 是具有 Abbreviation 和 Name 属性的业务对象:

this._stateComboBox.DataSource = ((Address)this._addressBindingSource.DataSource).States;
this._stateComboBox.DisplayMember = "Abbreviation";
this._stateComboBox.DataBindings.Add(new System.Windows.Forms.Binding("SelectedItem", this._addressBindingSource, "State"));

最初 ComboBox 显示空白,因为没有选择任何状态。如果我跳到 ComboBox 并尝试跳出,SelectedItem 为空,但我得到一个异常:

Object of type 'System.DBNull' cannot be converted to type 'State'.

知道为什么 BindingSource 在尝试将其分配给 Address.State 属性之前似乎采用 null SelectedItem 并将其设为 System.DBNull 吗?在调用我的 State setter 之前,此异常发生在 OnValidating 中。如果没有调试器,看起来焦点会卡在 ComboBox 上。

我不想在我的数据源中添加一个空的 State 对象,而 Abbreviation 和 Name 都是空的。我该如何解决这个问题?

【问题讨论】:

    标签: c# winforms data-binding combobox selecteditem


    【解决方案1】:

    这是因为控件验证是 Binding 类的默认设置。您可能希望将 Binding.DataSourceUpdateMode 属性更改为 DataSourceUpdateMode.OnPropertyChanged,以便仅在用户更改组合框选择时分配值。

    【讨论】:

    • 这对我来说不太好;但是它确实给了我一个提示,让我找到了一个解决方法:我现在在创建 Binding 对象时设置 DataSourceNullValue = null 。尽管这可以让我绕过异常,但遗憾的是它不允许我提交 null 值。换句话说,如果我清除控件的显示值,则在验证期间从绑定对象中检索非 null 属性值,而不是将绑定对象属性设置为 null。
    • 我为此苦苦挣扎了几个小时,直到我找到了这篇文章。谢谢!
    • 这可能是一种解决方法,但我想知道实际问题的答案。为什么会发生这种情况,null在哪里变成了DBNull,更重要的是如何阻止这种情况发生?
    猜你喜欢
    • 2015-09-29
    • 2019-06-03
    • 2010-10-24
    • 2019-11-10
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    相关资源
    最近更新 更多