2012-10-18 97 views
0

我已經綁定到對象數據源的表單。它有一個文本框和一個組合框。我爲主對象設置了一個綁定源,併爲組合框設置了一個綁定源。當我運行窗體時,文本框被正確綁定,並且組合框中的值列表被正確綁定,但組合框的ValueMember無法正常工作。將Combobox綁定到對象數據源

組合框顯示正確的列表,但它的選擇索引是0而不是它應該是2.當我更改文本框中的值時,綁定對象的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 

下面是主要對象的代碼 - 「工單」

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 
+0

你有很多事情會在這裏的。我非常難以幫助你。你能否將其解決到問題的根本要點?也許你會通過這樣做找到解決方案。 – danyim

+0

我不確定我能否再簡化它。最小的問題需要2個對象,一個綁定列表和一個表單。綁定似乎可以使用數據集正常工作,但似乎使用對象作爲數據源失敗。該表單的代碼非常簡單(恕我直言)。如果有幫助,我會很樂意解釋代碼的任何部分。 – ccampj

+0

我沒有看到你爲combobox設置實際的數據綁定。它只是從你的代碼示例中丟失了嗎? –

回答

1

在您的代碼中,您只是將DataSource分配給ComboBox,但您並未建立任何DataBi尋找它。

你需要這樣一本線(用C#在這裏):

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

希望這有助於