将窗体的一个实例的TextBox控件的更改值更新为所有实例

时间:2019-01-17 15:20:51

标签: .net vb.net winforms

我有一个父窗体和一个子窗体(都是Windows窗体)。在父表单上,我有一个$.get('https://{api_path}.php',function(data, textStatus, jqXHR){ console.log(jqXHR.responseText); return data; }); ,带有2个标签,每个标签都需要添加一个子表单。

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

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

TextBox

但是在一个实例上更改时不知道如何在其他实例上更改值。

2 个答案:

答案 0 :(得分:2)

您可以使用数据绑定到应用程序设置,也可以将数据绑定到任何其他支持双向数据绑定的类的单个实例:

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

  2. 添加一个新的设置属性并对其进行命名,例如 Setting1 ,然后将其设置为字符串并根据需要分配默认值。

  3. 在Designer处打开您的表单。
  4. 选择要在其中显示值的TextBox
  5. 属性窗口中,展开(应用程序设置),然后单击(PropertyBinding)前面的 ...
  6. 应用程序设置窗口中,选择Text属性,并作为值,选择在步骤2中创建的设置属性。
  7. 如果要使用多个表格来显示值,请对每种表格重复步骤3至6。

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

答案 1 :(得分:1)

类似于Reza Aghaei described,是手动应用的。

过程说明:

  • 为子表单创建一个容器,该容器将用于基本管理(添加/删除和处置子表单)。在这里,一个名为{strong> List(Of Form)ChildForms
  • 创建一个DataSource,这里是一个DataTable(命名为 BindingDataTable ),用于为两种不同子窗体中的文本框提供默认值< / li>
  • 创建一个BindingSource(名为 TextBoxBindings ),它将为控件提供绑定逻辑/支持。
  • DataSource中的BindingSource设置为数据表以连接数据。
  • Bindings添加到子窗体的TextBox控件中,以将其Text属性连接到共享数据源。
  • Binding.Parse事件中添加事件处理程序,该事件处理程序将用于在更改文本框时解析/验证TextBoxes的Text属性的值。
  • 将无边框的子窗体添加到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

抽样结果:

BindingSource to WinForms Controls