【问题标题】:Lost databinding of usercontrol in winforms when changing parent control更改父控件时,winforms 中用户控件的数据绑定丢失
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-05
    • 2019-06-05
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    相关资源
    最近更新 更多