我有一个GUI,允许用户选择要查看/编辑的报告。当用户选择报告时,它会显示报告中的项目。该项具有许多属性 - 其中大多数都是正确绑定的。其中一个属性是Owner,它绑定到ComboBoxColumn。
我做了几次与此类似的事情,并且在设置DataPropertyName
,DataSource
,ValueMember
和DisplayMember
时没有遇到任何问题。唯一的区别是,这一次而不是具有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
属性。这看起来很糟糕 - 而且我认为我误解了一些基本的东西,因为它仍然无法正常运作。任何帮助将不胜感激。
答案 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