簡體   English   中英

將對象集合綁定到DataGridView中的ComboboxColumn

[英]Binding a collection of objects to a ComboboxColumn in a DataGridView

我有一個GUI,允許用戶選擇要查看/編輯的報告。 當用戶選擇報告時,它將在報告中顯示項目。 該項目具有許多屬性-大多數屬性都已正確綁定。 屬性之一是所有者,並且綁定到ComboBoxColumn。

  • 報告
    • 物品
      • 所有者

我做了幾次與此非常相似的操作,並且在設置DataPropertyNameDataSourceValueMemberDisplayMember時沒有問題。 唯一的區別是這次不是具有OwnderIDItem類型,而是實際上具有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

並通過使Owner上的ToString函數顯示OwnerName屬性。 但是,這似乎很棘手-而且我認為我對基本的東西有誤解,因為它仍然無法正常運行。 任何幫助將非常感激。

我發現很多錯誤是由於我對閱讀過的各種文章以及草率的代碼的誤解造成的。

我忽略了在某些屬性上指定返回類型,顯式選項/嚴格選項均已關閉,並且設計器中存在一些損壞,並且某些列已重復。

我最喜歡的解決方案是: 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM