vb.net 将组合框绑定到对象数据源

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12962271/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 15:59:06  来源:igfitidea点击:

Binding Combobox to Object Datasource

vb.netdata-binding

提问by ccampj

I've got a form bound to an object datasource. It has one text box and one combo box. I set up one binding source for the main object and one binding source for the combo box. When I run the form, the text box is bound correctly, and the list of values in the combo box is bound correctly, but the ValueMember of the combo box isn't working correctly.

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

The combo box shows the correct list, but it's selected index is 0 instead of what it should be 2. When I change the value in the text box, it's bound object's Property.Set method is called correctly, but the same Property.Set method is not called for the combo box.

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

I know I can hack up the OnSelectedIndex change methods in the form, but I would like to know what I am doing wrong in just using the Bindings.

我知道我可以修改表单中的 OnSelectedIndex 更改方法,但我想知道我在使用 Bindings 时做错了什么。

Here is the code on the form:

这是表格上的代码:

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

Here's the code for the main object - "WorkOrder"

这是主要对象的代码 - “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

Here's the code for the object used in the combo box

这是组合框中使用的对象的代码

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

回答by Luc Morin

In your code, you are merely assigning the DataSource to the ComboBox, but you're not establishing any DataBinding for it.

在您的代码中,您只是将 DataSource 分配给 ComboBox,但并未为其建立任何 DataBinding。

You need a line like this (using C# here):

您需要这样的一行(此处使用 C#):

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

Hope this helps

希望这可以帮助