I am having a problem when I try to bind to text boxes to separate BindingContexts (via a container control such as a GroupBox). The textboxes don't display the bound value. (This example is based on the bindingcontext documentation here) (This has been submitted to Microsoft as a bug report and can be found here. The bug report includes a demo project and database with which i can recreate the problem.)
Here is the code:
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 SubWhen I run the form Textbox3 (at the form level) and textbox2 (in GroupBox2) are synchronized as expected and TextBox2 displays the value of OrderKey. However, Textbox1 (in GroupBox1) does not show any values. I have determined that GroupBox1 is indeed using a separate BindingContext and position commands do move to new rows independent of the form. If I comment out setting GroupBox1's BindingContext it behaves as Texbox2, synchronized at the form level. If I uncomment setting Groupbox2's BindingContext, it behaves as Textbox1, unsynchronized but doesn't display any values in the textbox.
I also tested setting GropuBox2.BindingContext = Me.BindingContext. This linked the two but TextBox2 no longer showed a value. Seems that if the GroupBox's DataContext is set, the contained TextBoxes' Text properties don't get bound.
Can anybody see what I'm missing?
Here is the full code:
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 ClassCarl