2012-01-24 42 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 
相关问题