2012-10-18 32 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)); 

希望这有助于