0

オブジェクト データソースにバインドされたフォームがあります。1 つのテキスト ボックスと 1 つのコンボ ボックスがあります。メイン オブジェクト用に 1 つのバインディング ソースと、コンボ ボックス用に 1 つのバインディング ソースを設定しました。フォームを実行すると、テキスト ボックスは正しくバインドされ、コンボ ボックスの値のリストも正しくバインドされますが、コンボ ボックスの ValueMember が正しく機能しません。

コンボ ボックスには正しいリストが表示されますが、選択されたインデックスは 2 ではなく 0 です。テキスト ボックスの値を変更すると、バインドされたオブジェクトの Property.Set メソッドが正しく呼び出されますが、同じ Property.Set メソッドが呼び出されます。コンボボックスでは呼び出されません。

フォームで OnSelectedIndex 変更メソッドをハックできることはわかっていますが、バインディングを使用するだけで何が間違っているのか知りたいです。

フォーム上のコードは次のとおりです。

Public Class Form1
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    Dim NameValueBindingSource1 As New BindingSource()
    Dim WorkOrderBindingSource1 As New BindingSource

    'Create main object to bind to
    Dim wo As New WorkOrder
    wo.WOIndex = "2012-0111"
    wo.WorkOrderType = 3

    'Create list object for combo box
    Dim NameValues As BindingList(Of NameValue)
    NameValues = FillNameValueList()

    'Bind Text Box to Binding Source
    WorkOrderBindingSource1.DataSource = wo
    WOIndexTextBox1.DataBindings.Add("Text", WorkOrderBindingSource1, "WOIndex")

    'Bind Combo Box to Binding Source
    NameValueBindingSource1.DataSource = NameValues
    WorkOrderTypeCombo.DataSource = NameValueBindingSource1
    WorkOrderTypeCombo.DisplayMember = "Value"
    WorkOrderTypeCombo.ValueMember = "Code"

End Sub

Function FillNameValueList() As BindingList(Of NameValue)
    Dim bl As New BindingList(Of NameValue)
    Dim nv As NameValue

    nv = New NameValue
    bl.Add(New NameValue("Short", 0))
    bl.Add(New NameValue("Middle", 1))
    bl.Add(New NameValue("Long", 2))
    bl.Add(New NameValue("Very Long", 3))

    Return bl
End Function
End Class

メイン オブジェクト「WorkOrder」のコードは次のとおりです。

Imports System.ComponentModel
Public Class WorkOrder
    Implements IEditableObject
    Implements INotifyPropertyChanged

    Private mWOIndex As String
    Private mWorkOrderType As Integer

    Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged

    Public Property WOIndex As String
        Get
            Return mWOIndex
        End Get
        Set(value As String)
            mWOIndex = value
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("WOIndex"))
        End Set
    End Property
    Public Property WorkOrderType As Integer
        Get
            Return mWorkOrderType
        End Get
        Set(value As Integer)
            mWorkOrderType = value
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("WorkOrderType"))
        End Set
    End Property
    Public Sub BeginEdit() Implements System.ComponentModel.IEditableObject.BeginEdit
    End Sub
    Public Sub CancelEdit() Implements System.ComponentModel.IEditableObject.CancelEdit
    End Sub
    Public Sub EndEdit() Implements System.ComponentModel.IEditableObject.EndEdit
    End Sub
End Class

コンボボックスで使用されるオブジェクトのコードは次のとおりです

Imports System.ComponentModel

Public Class NameValue
    Implements IEditableObject
    Implements INotifyPropertyChanged

    Private mValue As String
    Private mCode As Integer

    Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged

    Public Property Code As Integer
        Get
            Return mCode
        End Get
        Set(value As Integer)
            mCode = value
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Code"))
        End Set
    End Property
    Public Property Value As String
        Get
            Return mValue
        End Get
        Set(value As String)
            mValue = value
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Value"))
        End Set
    End Property

    Public Sub BeginEdit() Implements System.ComponentModel.IEditableObject.BeginEdit
    End Sub
    Public Sub CancelEdit() Implements System.ComponentModel.IEditableObject.CancelEdit
    End Sub
    Public Sub EndEdit() Implements System.ComponentModel.IEditableObject.EndEdit
    End Sub
    Public Sub New(InitValue As String, InitCode As Integer)
        Value = InitValue
        Code = InitCode
    End Sub
End Class
4

1 に答える 1

1

コードでは、DataSource を ComboBox に割り当てているだけですが、DataBinding を確立していません。

次のような行が必要です (ここでは C# を使用):

WorkOrderTypeCombo.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", WorkOrderBindingSource1, "WorkOrderType", true));

お役に立てれば

于 2012-10-19T10:48:17.927 に答える