2012-01-24 39 views
0

我有一個GUI,允許用戶選擇要查看/編輯的報告。當用戶選擇報告時,它會在報告中顯示項目。該項目有很多屬性 - 其中大部分都具有正確的綁定。其中一個屬性是Owner,並且它綁定到ComboBoxColumn。將對象集合綁定到DataGridView中的ComboboxColumn

  • 報告
    • 項目
      • 所有者

我已經做了非常相似,這幾次的東西,有沒有問題,當我設置DataPropertyNameDataSource,ValueMemberDisplayMember。唯一不同的是,這一次,而不是Item類型具有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 

,並通過使Owner顯示屏上的ToString功能OwnerName財產。儘管這看起來很詭異 - 但我認爲我誤解了一些基本的東西,因爲它仍然無法正常工作。任何幫助將非常感激。

回答

0

我發現了很多我的錯誤是從我我讀過的各種物品的誤解,以及草率的代碼來。

我忽略的幾個屬性指定返回類型,明確的選項/選項嚴格均爲關閉,並出現了在我設計了一些腐敗現象和一些列的被複制。

我最喜歡的解決方案是:http://code.google.com/p/systembusinessobjects/source/browse/trunk/System.BusinessObjects.Framework/Data/SafeBindingLists.cs。不幸的是,這需要Castle代理和一箇舊版本的NHibernate。

下面是簡單的解決方案,我發現:

的問題是,你不能綁定與多種類型的對象列表。我們的目標是能夠有組合框直接設置它必然與其他對象的對象上的屬性的值。

我選擇使用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 
相關問題