更改父控件时,丢失了winforms中用户控件的数据绑定



我试了很多小时:我有一个简单的例子,里面有一个microsoft文本框和一个用户控件上的文本框。两者都有数据绑定到数据网格,一切都很好,当你滚动数据网格时,值会自动变化。

在移动组框上的两个控件(更改其父控件的内容(后,数据绑定将由Microsoft的子BindingContext.UpdateBinding处理。文本框的绑定将被删除并再次添加,但用户控件的绑定将删除,但再也不会回来,数据绑定已失效。

这是怎么回事?

Imports System.ComponentModel
Public Class Class1
Public Shared Sub Main()
Dim form1 As New Form With {.Width = 800, .Height = 600, .StartPosition = FormStartPosition.CenterScreen}
Dim dataGrid1 As New DataGrid With {.Width = 780, .Height = 300}
form1.Controls.Add(dataGrid1)
Dim textbox1 As New TextBox With {.Left = 30, .Top = 400}
form1.Controls.Add(textbox1)
Dim userControl1 As New UserControl1 With {.Left = 150, .Top = 397, .BackColor = System.Drawing.Color.Aqua}
form1.Controls.Add(userControl1)
Dim groupBox1 As New GroupBox With {.Left = 410, .Top = 320, .Height = 200, .Width = 350, .Text = "GroupBox"}
form1.Controls.Add(groupBox1)
Dim button1 As New Button With {.Left = 290, .Top = 400, .Text = "--->"}
form1.Controls.Add(button1)
AddHandler button1.Click, Sub()
groupBox1.Controls.AddRange({textbox1, userControl1}) : textbox1.Top = 70 : userControl1.Top = 67
End Sub
Dim snTBL = New System.Data.DataTable("serialnumbers")
snTBL.Columns.Add(New DataColumn("serialnumber1", GetType(String)))
snTBL.Columns.Add(New DataColumn("serialnumber2", GetType(String)))
For i = 0 To 5
Dim row As DataRow = snTBL.NewRow
row.Item("serialnumber1") = CStr(i)
row.Item("serialnumber2") = CStr(i * 10)
snTBL.Rows.Add(row)
Next
dataGrid1.DataSource = snTBL
textbox1.DataBindings.Add(NameOf(textbox1.Text), snTBL, "serialnumber1")
userControl1.DataBindings.Add(NameOf(userControl1.BindingText), snTBL, "serialnumber2")
Application.Run(form1)
End Sub

<System.ComponentModel.DefaultBindingProperty(NameOf(UserControl1.BindingText))>
Public Class UserControl1
Inherits System.Windows.Forms.UserControl
Implements System.ComponentModel.INotifyPropertyChanged
Friend WithEvents TextBox1 As TextBox
Protected Overrides Sub oncreatecontrol()
Me.TextBox1 = New System.Windows.Forms.TextBox()
Me.SuspendLayout()
'
'TextBox1
'
Me.TextBox1.Location = New System.Drawing.Point(3, 3)
Me.TextBox1.Name = "TextBox1"
Me.TextBox1.Size = New System.Drawing.Size(103, 20)
Me.TextBox1.TabIndex = 0
'
'UserControl1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.Controls.Add(Me.TextBox1)
Me.Name = "UserControl1"
Me.Size = New System.Drawing.Size(109, 26)
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Public Property BindingText As String
Get
Return Me.TextBox1.Text
End Get
Set(value As String)
Me.TextBox1.Text = value
RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(NameOf(UserControl1.BindingText)))
End Set
End Property
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
End Class
End Class

多亏了@Jimi,解决方案是使用BindingSource,而不是直接绑定到DataTable。

最新更新