【问题标题】:DataGridViewComboBoxCell Empty ValueDataGridViewComboBoxCell 空值
【发布时间】:2014-01-02 19:32:10
【问题描述】:

我有一个带有几个组合框列的 DGV。这些列绑定到基本上是数据库中查找项的对象。我想为我的用户提供一个空白选项,以便在适用的情况下将这些查找项设置为 NULL。我尝试了各种将 Null 项添加到列表以允许用户选择空值的方法,但它似乎不起作用。

有没有一种最好的方法可以让我将列表绑定到控件,并允许用户输入空值而无需按 Ctrl+0?

Public Class RootItem
    Public Overridable Property Lookup
    Public Overridable Property Type as String
    Public Overridable Property Active as Boolean
End Class

Public Class LookupItem
    Public Overridable Property ID As Integer = -1
    Public Overridable Property Abbreviation As String = ""
    Public Overridable Property Name As String = ""
    Public Overridable Property Description As String = ""

    Public Overrides Function ToString() As String
        Return Abbreviation
    End Function

    Public Overridable ReadOnly Property Self
        Get
            Return Me
        End Get
    End Property
End Class

' My databinding
' ...
private rootItems as IList(of RootItem) = session.QueryOver(of RootItem).List

Private lookups As IList(Of LookupItem) = session.QueryOver(Of LookupItem).List

With LookupItemColumn
    .DataSource = lookupItems
    .DataPropertyName = PropUtil.GetName(Of RootItem)(Function(x) x.LookupItem)
    .DisplayMember = PropUtil.GetName(Of LookupItem)(Function(x) x.Abbreviation)
    .ValueMember = PropUtil.GetName(Of LookupItem)(Function(x) x.Self)
End With

myDgv.DataSource = New SortableBindingList(Of RootItem)(rootItems)

【问题讨论】:

  • 那么在下拉源中添加“空项”不是一种选择?
  • 我已经这样做了,但是绑定无法正常工作,并且下拉列表中没有显示任何项目。
  • 由于您的模型不允许 null,我能想到的唯一方法可能是创建一个自定义 DataGridViewComboBoxColumn。
  • 我的模型如何禁止空值?既然我绑定的属性是 Nullable Object(一个类),难道不应该允许吗?
  • 我假设您使用的是数据表。也许你可以提供一些代码? :)

标签: .net vb.net nhibernate data-binding


【解决方案1】:

我对这个问题的解决方案是让我绑定到 ComboBox 的所有项目都实现一个 LookupItem 接口。

有了这个,我获取了我想要绑定到的每个项目列表并添加了一个“虚拟”项目。

然后,我处理了CellValueChanged 事件并使用了一些反射来检测正在编辑的列是否是 ComboBoxColumn,如果是,它将获取该列绑定到的属性,并找出它的值是否现在设置为是我的虚拟项目(我通过使用空 ID 确定了这一点)。如果它是空项,则将该属性的值(再次使用反射)设置为 Null。这样,用户可以轻松地将属性设置为 null,并且我的对象仍然正确地持久化到数据库中。添加更多列也不是太难,因为它只需要实现 LookupItem 接口。

【讨论】:

    猜你喜欢
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2014-08-06
    • 2019-04-30
    • 1970-01-01
    相关资源
    最近更新 更多