首页 > 解决方案 > 更改父控件时,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

标签: vb.netwinformsdata-bindingdatagrid

解决方案


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


推荐阅读