【发布时间】:2020-06-17 14:18:36
【问题描述】:
我尝试了很多小时:我有一个简单的示例,其中包含一个 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
【问题讨论】:
-
我会将
Public Sub New()添加到用户控件中,您可以在其中调用InitializeComponent()。您可以在Private Sub InitializeComponent()中重命名您的Protected Overrides Sub oncreatecontrol()。然后添加Dim bs As BindingSource = New BindingSource(snTBL, Nothing)并将Bindings 的DataSource 设置为BindingSource(例如userControl1.DataBindings.Add(NameOf(userControl1.BindingText), bs, "serialnumber2", False, DataSourceUpdateMode.OnPropertyChanged))。就是这样。
标签: vb.net winforms data-binding datagrid