1

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
4

2 に答える 2

0

わかりました、問題はコンボボックスが故障していたことです。フォームからコントロールを削除して再度追加すると、問題は解決しました。役立つ情報が含まれているため、回答を受け入れます。

ありがとう

于 2013-06-10T14:22:59.270 に答える