![](/img/trans.png)
[英]DataGridView binding after replacing column with comboboxcolumn
[英]Binding a collection of objects to a ComboboxColumn in a DataGridView
我有一個GUI,允許用戶選擇要查看/編輯的報告。 當用戶選擇報告時,它將在報告中顯示項目。 該項目具有許多屬性-大多數屬性都已正確綁定。 屬性之一是所有者,並且綁定到ComboBoxColumn。
我做了幾次與此非常相似的操作,並且在設置DataPropertyName
, DataSource
, ValueMember
和DisplayMember
時沒有問題。 唯一的區別是這次不是具有OwnderID
的Item
類型,而是實際上具有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.