使用父控件的TextBoxes BindingContexts不显示数据值

时间:2014-07-17 16:10:37

标签: vb.net winforms

当我尝试绑定到文本框以分离BindingContexts(通过容器控件,如GroupBox)时,我遇到了问题。文本框不显示绑定值。 (此示例基于bindingcontext文档here

以下是代码:

Dim ds As New DataSet1

Public Sub New()
    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    BindControls()
    GetData()
End Sub

Private Sub BindControls()
    Dim bcG1 As New BindingContext()
    Dim bcG2 As New BindingContext()

    GroupBox1.BindingContext = bcG1
    'GroupBox2.BindingContext = bcG2

    TextBox1.DataBindings.Add("Text", ds, "Orders.OrderKey")    ' groupbox1
    TextBox2.DataBindings.Add("Text", ds, "Orders.OrderKey")    ' groupbox2
    TextBox3.DataBindings.Add("Text", ds, "Orders.OrderKey")    ' form
End Sub

当我运行表单Textbox3(在表单级别)和textbox2(在GroupBox2中)按预期同步时,TextBox2显示OrderKey的值。但是,Textbox1(在GroupBox1中)不显示任何值。我已经确定GroupBox1确实使用了单独的BindingContext,并且位置命令确实移动到独立于表单的新行。如果我注释掉设置GroupBox1的BindingContext,它的行为就像Texbox2一样,在表单级别同步。如果我取消注释设置Groupbox2的BindingContext,它的行为与Textbox1不同步,但不会在文本框中显示任何值。

有人能看到我失踪的东西吗?

以下是完整代码:

Imports System
Imports System.Data
Imports System.Data.SqlClient

Public Class Form1

Dim ds As New DataSet1

Public Sub New()
    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    BindControls()
    GetData()
End Sub

Private Sub BindControls()
    Dim bcG1 As New BindingContext()
    Dim bcG2 As New BindingContext()

    GroupBox1.BindingContext = bcG1
    'GroupBox2.BindingContext = bcG2

    TextBox1.DataBindings.Add("Text", ds, "Orders.OrderKey")    ' groupbox1
    TextBox2.DataBindings.Add("Text", ds, "Orders.OrderKey")    ' groupbox2
    TextBox3.DataBindings.Add("Text", ds, "Orders.OrderKey")    ' form
End Sub

' ** groupbox1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    GroupBox1.BindingContext(ds, "Orders").Position -= 1
    Dim drv As DataRowView = CType(GroupBox1.BindingContext(ds, "Orders").Current, DataRowView)
    TextBox5.Text = drv("OrderKey")
End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    GroupBox1.BindingContext(ds, "Orders").Position += 1
    Dim drv As DataRowView = CType(GroupBox1.BindingContext(ds, "Orders").Current, DataRowView)
    TextBox5.Text = drv("OrderKey")
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    GroupBox2.BindingContext(ds, "Orders").Position -= 1
    Dim drv As DataRowView = CType(GroupBox2.BindingContext(ds, "Orders").Current, DataRowView)
    TextBox6.Text = drv("OrderKey")
End Sub


' ** groupbox2
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    GroupBox2.BindingContext(ds, "Orders").Position += 1
    Dim drv As DataRowView = CType(GroupBox2.BindingContext(ds, "Orders").Current, DataRowView)
    TextBox6.Text = drv("OrderKey")
End Sub

Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    Me.BindingContext(ds, "Orders").Position -= 1
    Dim drv As DataRowView = CType(Me.BindingContext(ds, "Orders").Current, DataRowView)
    TextBox4.Text = drv("OrderKey")
End Sub

' ** Form
Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
    Me.BindingContext(ds, "Orders").Position += 1
    Dim drv As DataRowView = CType(Me.BindingContext(ds, "Orders").Current, DataRowView)
    TextBox4.Text = drv("OrderKey")
End Sub

Private Sub GetDataButton_Click(sender As Object, e As EventArgs) Handles GetDataButton.Click
    GetData()
End Sub

Public Sub GetData()
    ds.Clear()
    Dim ota As New DataSet1TableAdapters.OrdersTableAdapter
    ota.Adapter.SelectCommand = New SqlCommand("SELECT OrderKey, CustomerFK, OrderDate, DeliveryMethod, Special_Instr, " & _
            "TotalOrderAmount " & _
            "FROM Orders ", ota.Connection)
    ota.Adapter.Fill(ds)
End Sub
End Class

1 个答案:

答案 0 :(得分:0)

微软此时拒绝解决错误报告,但我确实发现我可以使用BindingSource来完成我想要做的事情。重要说明:要设置过滤器,需要将BindingSource.DataSource属性设置为新的DataView。默认情况下,它使用DataTable的默认视图,因此在BindingSource的一个实例上设置过滤器会将其设置为另一个实例。 DataSource赋值与此类似:

BindingSource1.DataSource = New DataView(DataSource1.DataTable1)

以下是修订后的代码:

Imports System

导入System.Data Imports System.Data.SqlClient

公共类Form1BindingSource

Dim ds As New DataSet1
Dim bsForm As BindingSource
Dim bsG1 As BindingSource
Dim bsG2 As BindingSource
Dim BindingSource1 As BindingSource

Private _OcConnectionString As String
Public Property OcConnectionString() As String
    Get
        Return _OcConnectionString
    End Get
    Set(ByVal value As String)
        _OcConnectionString = value
    End Set
End Property

Public Sub New()
    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    BindControls()
    GetData()
End Sub

Public Sub New(strConnection As String)
    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    OcConnectionString = strConnection
    BindControls()
    GetData()
End Sub

Private Sub BindControls()

    bsForm = New BindingSource
    bsG1 = New BindingSource
    bsG2 = New BindingSource

    bsForm.DataSource = ds
    bsG1.DataSource = ds
    bsG2.DataSource = ds

    bsForm.DataMember = "Orders"
    bsG1.DataMember = "Orders"
    bsG2.DataMember = "Orders"

    'BindingSource1 = New BindingSource(ds, "Orders")
    BindingSource1 = New BindingSource
    BindingSource1.DataSource = ds
    BindingSource1.DataMember = "Orders"
    Me.DataGridView1.DataSource = BindingSource1

    TextBox1.DataBindings.Add("Text", bsG1, "OrderKey")    ' groupbox1
    TextBox2.DataBindings.Add("Text", bsG2, "OrderKey")    ' groupbox2
    TextBox3.DataBindings.Add("Text", BindingSource1, "OrderKey")    ' form
    TextBox8.DataBindings.Add("Text", BindingSource1, "OrderKey")    ' Groupbox3

End Sub

' ** groupbox1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    bsG1.MovePrevious()
    'GroupBox1.BindingContext(ds, "Orders").Position -= 1
    Dim drv As DataRowView = CType(bsG1.Current, DataRowView)
    TextBox5.Text = drv("OrderKey")
End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    bsG1.MoveNext()
    'GroupBox1.BindingContext(ds, "Orders").Position += 1
    Dim drv As DataRowView = CType(bsG1.Current, DataRowView)
    TextBox5.Text = drv("OrderKey")
End Sub

' ** groupbox2
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    bsG2.MovePrevious()
    'GroupBox2.BindingContext(ds, "Orders").Position -= 1
    Dim drv As DataRowView = CType(bsG2.Current, DataRowView)
    TextBox6.Text = drv("OrderKey")
End Sub

Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    bsG2.MoveNext()
    'GroupBox2.BindingContext(ds, "Orders").Position += 1
    Dim drv As DataRowView = CType(bsG2.Current, DataRowView)
    TextBox6.Text = drv("OrderKey")
End Sub

'** form level
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    bsForm.MovePrevious()
    'Me.BindingContext(ds, "Orders").Position -= 1
    Dim drv As DataRowView = CType(bsForm.Current, DataRowView)
    TextBox4.Text = drv("OrderKey")
End Sub

Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
    bsForm.MoveNext()
    'Me.BindingContext(ds, "Orders").Position += 1
    Dim drv As DataRowView = CType(bsForm.Current, DataRowView)
    TextBox4.Text = drv("OrderKey")
End Sub

'** Groupbox3
Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
    bsForm.MovePrevious()
    'GroupBox3.BindingContext(ds, "Orders").Position -= 1
    Dim drv As DataRowView = CType(bsForm.Current, DataRowView)
    TextBox8.Text = drv("OrderKey")
End Sub

Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
    bsForm.MoveNext()
    'GroupBox3.BindingContext(ds, "Orders").Position += 1
    Dim drv As DataRowView = CType(bsForm.Current, DataRowView)
    TextBox8.Text = drv("OrderKey")
End Sub

Private Sub GetDataButton_Click(sender As Object, e As EventArgs) Handles GetDataButton.Click
    GetData()
End Sub

Public Sub GetData()
    Try
        Dim ota As New DataSet1TableAdapters.OrdersTableAdapter
        If OcConnectionString IsNot Nothing Then
            ota.Connection.ConnectionString = OcConnectionString
        End If
        ds.Clear()
        ota.Adapter.SelectCommand = New SqlCommand("SELECT OrderKey, CustomerFK, OrderDate, DeliveryMethod, Special_Instr, " & _
                "TotalOrderAmount " & _
                "FROM Orders ", ota.Connection)
        ota.Adapter.Fill(ds)
    Catch exp As Exception
        MsgBox(exp.Message)
    End Try
End Sub

结束班

卡尔