VB.NET (VS2008/.NET 3.5) でオブジェクトをコンボボックスにデータバインドする際に問題が発生しています。私のコードのこの簡略化されたバージョンを見てください:
Friend Class clDocument
Private _items as New List(Of clDocumentItems)
<System.ComponentModel.DisplayName("Items")> _
<System.ComponentModel.Bindable(True)> _
Public Property Items() As List(Of clDocumentItems)
Get
Return _items
End Get
Set(ByVal value As List(Of clDocumentItems))
_items = value
RaiseEvent ItemsChanged(Me, New EventArgs)
End Set
End Property
Public Event ItemsChanged As EventHandler
End Class
Friend Class clDocumentItems
Private _uid as String = ""
Private _docnumber as String = ""
<System.ComponentModel.DisplayName("UID")> _
<System.ComponentModel.Bindable(True)> _
Public Property UID() As String
Get
Return _uid
End Get
Set(ByVal value As String)
_uid = value
RaiseEvent UIDChanged(Me, New EventArgs)
End Set
End Property
<System.ComponentModel.DisplayName("Document")> _
<System.ComponentModel.Bindable(True)> _
Public Property DocNumber() As String
Get
Return _docnumber
End Get
Set(ByVal value As String)
_docnumber = value
RaiseEvent DocNumberChanged(Me, New EventArgs)
End Set
End Property
Public Event UIDChanged As EventHandler
Public Event DocNumberChanged As EventHandler
End Class
別の場所で、次のコードを取得しました。
Private Sub cmd_go_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_go.Click
'Try to load the object with data, this works well
Dim _document as New clDocument
_document.Load(somevalue)
cmb_docs.DataSource = Nothing
cmb_docs.Items.Clear()
If _document.UID = "" Then Exit Sub 'Object wasn't loaded so get out
'Create the binding.
cmb_docs.ValueMember = "UID"
cmb_docs.DisplayMember = "DocNumber"
cmb_docs.DataSource = _document.Items
End Sub
ここでの問題は、_document.Items 内のオブジェクトと同じ数のアイテムが ComboBox に取り込まれますが、実際のデータを渡さないことです。コンボ ボックスは「Namespace.clDocumentItems」文字列で埋められます。通常のクラス プロパティ (文字列、整数など) にバインドされている場合、同様のコードが完全に機能することに注意してください。
ここで、デバッガーのリフレクションを使用して、Datsource がフィールドではなくオブジェクトのリストを受け取っているためだと推測できますが、それらの値だけで別の配列またはリストを作成せずにそれを回避する方法がわかりません。それを Datasource プロパティに渡します...
似たようなものを探してサイトを探索しましたが、 3 年前に答えられなかったこの質問だけが近かったので、今日は幸運を祈ります ;)
御時間ありがとうございます!
編集:以下に、コメントで要求されているように、DataGridView へのデータバインディングに使用したコードを追加します。
Private WithEvents _bs as New BindingSource
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
DataGridView1.AutoGenerateColumns = False
Dim column As DataGridViewColumn = New DataGridViewTextBoxColumn()
column.DataPropertyName = "Document"
column.Name = "colDoc"
DataGridView1.Columns.Add(column)
_bs.DataSource = _document.Items
Me.DataGridView1.DataSource = _bs
End Sub