vb.net - 更改父控件时,winforms 中用户控件的数据绑定丢失
问题描述
我尝试了很多小时:我有一个简单的示例,其中包含一个 Microsoft 文本框和一个用户控件上的文本框。无论是数据绑定到数据网格,everythink 都可以正常工作,当您滚动浏览数据网格时,值会自动更改。
在组框上移动两个控件(改变它们的父级)后,数据绑定由微软的子 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。
推荐阅读
- linux - 如何修复centos中nic多队列错误的中断不平衡
- stata - 手动创建交互项
- excel - VBA宏完成后VBS崩溃?
- regex - Nginx 正则表达式重写问题
- kendo-ui - 如果我在网格中应用其他条件,则可过滤不适用于网格
- javascript - 如何修复:图片库、带有叠加层的图片未打开灯箱
- autodesk-forge - 使用 Forge AR/VR Toolkit 加载时模型不完整
- amazon-web-services - 如何计算 CloudWatch 日志中 IP 地址的出现次数
- python - 在 Azure 认知服务上更改 SpeechRecognizer 语言
- messaging - WAMP 协议没有被广泛采用的原因是什么?