2012-10-18 2 views
0

오브젝트 데이터 소스에 바인드 된 양식이 있습니다. 하나의 텍스트 상자와 하나의 콤보 상자가 있습니다. 기본 객체에 대해 하나의 바인딩 소스를 설정하고 콤보 상자에 대해 하나의 바인딩 소스를 설정했습니다. 양식을 실행하면 텍스트 상자가 올바르게 바인딩되고 콤보 상자의 값 목록이 올바르게 바인딩되지만 콤보 상자의 ValueMember가 올바르게 작동하지 않습니다.콤보 박스를 오브젝트 데이터 소스에 바인딩하기

콤보 상자에 올바른 목록이 표시되지만 선택한 색인은 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 

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

하는 데 도움이

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

희망 :

당신은 (여기에 사용하여 C#을)이 같은 라인이 필요합니다. 너를 돕기 위해 나를 따라하기가 어렵다. 문제의 핵심 요소에 이르기까지 그것을 제거 할 수 있습니까? 어쩌면 당신은 단지 그렇게함으로써 해결책을 찾을 수있을 것입니다. – danyim

+0

더 이상 단순화 할 수 있을지 확신하지 못합니다. 최소한의 문제는 2 개의 객체, 바인딩 목록 및 양식이 필요합니다. 바인딩은 데이터 세트를 사용하여 정상적으로 작동하지만 데이터 소스로 객체를 사용하여 실패하는 것 같습니다. 이 양식의 코드는 꽤 간단합니다 (IMHO). 필요한 경우 코드의 일부를 설명하면 도움이 될 것입니다. – ccampj

+0

콤보 박스의 실제 데이터 바인딩을 어디에 설정했는지는 알 수 없습니다. 코드 샘플에서 누락 되었습니까? –

답변

1

코드에서 데이터 소스를 ComboBox에 할당하는 것만으로 DataBi를 설정하지는 않습니다 그것을위한 nding. 이 당신은 일이 여기에 무슨 많이 가지고

관련 문제