【问题标题】:Binding Combobox to Object Datasource将组合框绑定到对象数据源
【发布时间】:2012-10-18 19:29:45
【问题描述】:

我有一个绑定到对象数据源的表单。它有一个文本框和一个组合框。我为主对象设置了一个绑定源,为组合框设置了一个绑定源。当我运行表单时,文本框已正确绑定,组合框中的值列表已正确绑定,但组合框的 ValueMember 无法正常工作。

组合框显示正确的列表,但它选择的索引是 0 而不是它应该是 2。当我更改文本框中的值时,它的绑定对象的 Property.Set 方法被正确调用,但相同的属性.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

【问题讨论】:

  • 这里发生了很多事情。我很难跟随你来帮助你。你能把它分解成问题的基本要素吗?也许你会通过这样做找到解决方案。
  • 我不确定我是否可以再简化它。最小的问题需要 2 个对象、一个绑定列表和一个表单。使用数据集绑定似乎可以正常工作,但使用对象作为数据源似乎失败了。表单的代码非常简单(恕我直言)。如果有帮助,我将很乐意根据需要解释代码的任何部分。
  • 我看不到您为组合框设置实际数据绑定的位置。您的代码示例中是否缺少它?
  • 组合框绑定发生在:NameValueBindingSource1.DataSource = NameValues WorkOrderTypeCombo.DataSource = NameValueBindingSource1
  • 好的,您确认它不只是从您的示例代码中丢失,所以请参阅下面的答案。

标签: vb.net data-binding


【解决方案1】:

在您的代码中,您只是将 DataSource 分配给 ComboBox,而不是为它建立任何 DataBinding。

你需要这样一行(这里使用 C#):

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

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2013-09-03
    • 2013-09-20
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多