将对象集合绑定到DataGridView中的ComboboxColumn

时间:2012-01-24 03:25:29

标签: .net vb.net data-binding datagridview datagridviewcombobox

我有一个GUI,允许用户选择要查看/编辑的报告。当用户选择报告时,它会显示报告中的项目。该项具有许多属性 - 其中大多数都是正确绑定的。其中一个属性是Owner,它绑定到ComboBoxColumn。

  • 报告
    • 产品
      • 所有者

我做了几次与此类似的事情,并且在设置DataPropertyNameDataSourceValueMemberDisplayMember时没有遇到任何问题。唯一的区别是,这一次而不是具有Item的{​​{1}}类型,它实际上有一个OwnderID对象的实例。

我在另一篇文章中看到了一个建议来解决这个问题,方法是为列表中绑定的项目提供一个自引用属性,允许它们为了设置Owner

而自行返回

然而,当我以这种方式绑定它时:

ValueMember

我收到很多错误:

OwnerColumn.DataPropertyName = "Owner"
OwnerColumn.DataSource = ownersBindingSource1
OwnerColumn.ValueMember = "Self"
OwnerColumn.DisplayMember = "OwnerName"

Unable to cast object of type 'System.String' to type 'Owner'.

我能够通过这样绑定来解决其中的一些错误:

The following exception occurred in the DataGridView:

System.ArgumentException: DataGridViewComboBoxCell value is not valid.

To replace this default dialog please handle the DataError event.

并使OwnerColumn.DataPropertyName = "Owner" OwnerColumn.DataSource = ownersBindingSource1 上的ToString函数显示Owner属性。这看起来很糟糕 - 而且我认为我误解了一些基本的东西,因为它仍然无法正常运作。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我发现我的很多错误来自于我对我读过的各种文章的误解,以及草率的代码。

我忽略了在一些属性上指定了返回类型,选项explicit / option strict都关闭了,我的设计器中出现了一些损坏,并且一些列被重复了。

我最喜欢的解决方案是:http://code.google.com/p/systembusinessobjects/source/browse/trunk/System.BusinessObjects.Framework/Data/SafeBindingLists.cs。不幸的是,这需要Castle代理和旧版本的NHibernate。

以下是我找到的简单解决方案:

问题是您无法使用多种类型的对象绑定列表。目标是能够让ComboBox直接在与另一个对象绑定的对象上设置属性的值。

我选择使用View对象,并将列表绑定到该对象。

查看对象:

Public Class OwnerView
    Private _owner As Owner

    Public ReadOnly Property OwnerId As Integer
        Get
            Return _owner.OwnerId
        End Get
    End Property

    Public ReadOnly Property OwnerName As String
        Get
            Return _owner.OwnerName
        End Get
    End Property

    Public ReadOnly Property OwnerAbbreviation As String
        Get
            Return _owner.OwnerAbbreviation
        End Get
    End Property

    Public Overridable ReadOnly Property Self As Owner
        Get
            Return _owner
        End Get
    End Property

    Public Sub New(ByVal owner As Owner)
        _owner = owner
    End Sub

End Class

结合:

With OwnerColumn
    .SortMode = DataGridViewColumnSortMode.Automatic
    .ReadOnly = False
    .Name = "OwnerColumn"
    .HeaderText = "Owner"

    Dim bs As New BindingSource()

    For Each co As Owner In Owners
        bs.Add(New OwnerView(co))
    Next

    .DataPropertyName = "Owner"
    .DataSource = bs
    .ValueMember = "Self"
    .DisplayMember = "OwnerName"

    ItemDataGridView.Columns.Add(OwnerColumn)
End With