当我尝试绑定到文本框以分离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
答案 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
结束班
卡尔