【问题标题】:Update changed value of TextBox control of one instance of form into all instances将一个表单实例的 TextBox 控件的更改值更新为所有实例
【发布时间】:2019-01-17 15:20:50
【问题描述】:

我有一个父窗体和子窗体(都是 windows 窗体)。在父表单上,我有一个带有 2 个选项卡的 TabControl,每个选项卡都需要添加一个子表单。

在一个子表单上,我有一个TextBox,其中一些值作为初始值。我想要的只是当我更改其中一个子窗体实例的 TextBox 值时,它也需要更新其他实例。

我已经设法在表单上添加了两个实例,

Private Sub Parent_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim ch As New Child
    Dim ch1 As New Child
    ch.Top = False
    ch.TopLevel = False
    ch1.Top = False
    ch1.TopLevel = False
    Panel1.Controls.Add(ch1)
    ch1.Show()
    Panel2.Controls.Add(ch)
    ch.Show()
End Sub

但不知道在一个实例上更改时如何更改另一个实例上的值。

【问题讨论】:

  • 我需要为每个标签添加一个子表单你想在标签上添加表单吗?
  • @JohnyL TopLevel 是假的,本质上是把表单变成了 UserControl。
  • @LarsTech 哎呀...错过了:)

标签: .net vb.net winforms


【解决方案1】:

您可以使用数据绑定到应用程序设置或数据绑定到任何其他支持两种方式数据绑定的类的单个实例:

  1. 打开 Settings.settings 文件。
    如果您选择显示解决方案资源管理器工具栏中的所有文件,它位于解决方案资源管理器中的“我的项目”节点下。您也可以通过右键单击项目节点,选择“属性”并选择“设置”选项卡来打开它。

  2. 添加一个新的设置属性并命名它,例如 Setting1 并让类型为字符串并根据需要分配一个默认值。

  3. 在设计器处打开您的表单。
  4. 选择要在其中显示值的TextBox
  5. Properties Window中,展开(Application Settings)并点击(PropertyBinding)前面的... em>。
  6. Application Settings 窗口中,选择 Text 属性并作为值,选择您在步骤 2 中创建的设置属性。
  7. 如果您要在多个表单中显示值,请对每个表单重复步骤 3 到 6。

当你运行应用程序时,当你输入任何绑定到设置值的TextBox控件时,所有绑定的文本框都会立即更新。

【讨论】:

  • 只有一件事,它不适用于其他数据类型,即十进制(在设置中)?
  • 这可能取决于属性类型。如果您想与设计器支持一起使用设置文件,在这种情况下绑定到Text 属性可能需要一个字符串属性。但一般来说,如第一行所述,解决方案是数据绑定到任何其他支持双向数据绑定的类的单个实例,而属性绑定到应用程序设置就是一个例子。如果有任何限制,请使用单个实例对象并手动设置数据绑定。
【解决方案2】:

类似于Reza Aghaei described手动应用

过程说明:

  • 为子表单创建一个容器,用于基本管理(添加/删除和处置子表单)。在这里,一个名为 ChildFormsList(Of Form)
  • 创建一个DataSource,这里是一个DataTable(名为BindingDataTable),用于为两个不同子窗体中的文本框提供默认值
  • 创建一个BindingSource(命名为TextBoxBindings),它将为控件提供绑定逻辑/支持。
  • BindingSourceDataSource设置为DataTable以连接Data。
  • Bindings 添加到子窗体的TextBox 控件中,以将它们的Text 属性连接到共享数据源。
  • Binding.Parse 事件添加一个事件处理程序,该事件处理程序将用于在文本框的文本属性更改时解析/验证它的值。
  • 将无边框子窗体添加到 TabControl 的 TabPages。
  • 必要时使用List(Of Form) 从 TabControl 中删除子窗体。

Private ChildForms As List(Of Form)
Private TextBoxBindings As BindingSource
Private BindingDataTable As DataTable

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    BindingDataTable = New DataTable("TextSource")
    BindingDataTable.Columns.Add(New DataColumn("TextValue", GetType(String)))
    Dim row As DataRow = BindingDataTable.NewRow()
    row.ItemArray = New String() {"Default text"}
    BindingDataTable.Rows.Add(row)

    TextBoxBindings = New BindingSource()
    TextBoxBindings.DataSource = BindingDataTable

    ChildForms = New List(Of Form)
    Dim ch1, ch2 As New ChildForm With {
        .FormBorderStyle = FormBorderStyle.None,
        .Location = Point.Empty,
        .Size = TabPage1.Size,
        .TopLevel = False
    }

    ChildForms.AddRange({ch1, ch2})

    For Each frm As Form In ChildForms
        Dim txt As TextBox = DirectCast(frm.Controls.Find("TextBox1", False)(0), TextBox)
        Dim txtBind = New Binding("Text", TextBoxBindings, "TextValue", True, DataSourceUpdateMode.OnPropertyChanged)
        AddHandler txtBind.Parse, AddressOf Me.OnBindingParse
        txt.DataBindings.Add(txtBind)
    Next

    TabPage1.Controls.Add(ChildForms(0))
    TabPage2.Controls.Add(ChildForms(1))
    ChildForms.ForEach(Sub(f) f.Show())
End Sub

Friend Sub OnBindingParse(sender As Object, e As ConvertEventArgs)
    If e.DesiredType Is GetType(String) Then
        TextBoxBindings.CurrencyManager.Refresh()
    End If
End Sub

Private Sub btnClearChilds_Click(sender As Object, e As EventArgs) Handles btnClearChilds.Click
    For i As Integer = 0 To ChildForms.Count - 1
        Dim txt As TextBox = DirectCast(ChildForms(i).Controls.Find("TextBox1", False)(0), TextBox)
        RemoveHandler txt.DataBindings.Item("Text").Parse, AddressOf Me.OnBindingParse
        ChildForms(i).Dispose()
    Next
    TextBoxBindings.Dispose()
    BindingDataTable.Dispose()
End Sub

示例结果:

【讨论】:

  • 非常感谢@Jimi 的评论。我使用了 Reza Aghaei 建议的 Property Way。因为我有很多需要更新的控件(文本框):-)
猜你喜欢
  • 1970-01-01
  • 2016-10-09
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 2013-11-20
相关资源
最近更新 更多