如何将值从一个表单传递到另一个表单的动态创建的控件

Posted

技术标签:

【中文标题】如何将值从一个表单传递到另一个表单的动态创建的控件【英文标题】:How to pass value from one form to another form's dynamically created control 【发布时间】:2014-03-30 17:22:21 【问题描述】:

假设我有两种形式,即Form1Form2。 Form1 包含动态创建的DataGridView 控件,Form2 包含两个Textbox 控件(Textbox1Textbox2) 以及一个Button 控件。

当我在DataGridView 的单元格上DoubleClick 时,它将打开Form2 并且来自当前选定单元格的数据传递到Form2Textbox1

代码如下:

我向动态创建的 DatagridView 添加了一个句柄,如下所示:

AddHandler dg.CellMouseDoubleClick, AddressOf dg_DataGridEdit Private Sub dg_DataGridEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) 将 dgView 调暗为 DataGridView = DirectCast(sender, DataGridView) Form2.TextBox1.Text = dgView.CurrentCell.Value.ToString() Form2.ShowDialog() 结束子

当我单击 Form2 中的按钮时,当前选定单元格的值将像 Form2 中的 TextBox2 一样发生变化。但问题是我不能使用来自 From2 的 button1 的代码,比如

Form1.dgView.CurrentCell.Value = TextBox2.Text

如何将值从 textbox2 传递到当前选定的单元格?

【问题讨论】:

【参考方案1】:

当您创建 DataGridView 时,存储对它的引用:

private _myDgv as DataGridView

Sub Form_load
    _myDgv = New dataGridView
    Me.Controls.Add(_myDgv)
    'etc.
End Sub

然后添加一个 ReadOnly 属性以从其他地方获取对它的引用:

Public ReadOnly Property DynamicDgv As DataGridView
    Get
        Return _myDgv
    End Get
End Property

那么你就可以在Form2中这样做了:

Form1.DynamicDgv.CurrentCell.Value = TextBox2.Text

【讨论】:

【参考方案2】:

我不会使用默认实例。这是一个在每个表单上使用文本框的示例:

表格1

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim f As New Form2(TextBox1F1) 'pass ref to form2
        f.ShowDialog()
    End Sub
End Class

表格2

Public Class Form2

    Dim txtbox As TextBox

    Public Sub New(tb As TextBox)

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        txtbox = tb 'get ref from calling form
    End Sub

    Private Sub Form2_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        TextBox1F2.Text = txtbox.Text
    End Sub

    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1F2.TextChanged
        txtbox.Text = TextBox1F2.Text
    End Sub
End Class

对 form2 上的文本框所做的任何更改都会反映在 form1 上的文本框中。

【讨论】:

这个问题与默认表单实例无关(实际上你没有解释为什么你不推荐这些) 如果您使用表单的默认实例,那么对该表单的任何更改都会在应用程序的生命周期内对其进行更改。假设他的表单有 10 个字段作为文本框,用户填写它们。下次显示表单时,这些文本框将具有相同的数据,而不是空白。由于许多其他原因,我不会使用默认实例,这比它值得的麻烦更多。 这里是“正确”方式的一个很好的例子:jmcilhinney.blogspot.com.au/2013/10/…【参考方案3】:

尝试复制到剪贴板作为一种解决方法,这样您就不必将文本从一种方法传递到下一种方法

System.Windows.Forms.Clipboard.SetText(...)

System.Windows.Forms.Clipboard.GetText(...)

【讨论】:

我认为这是一个解决方案。但是点击按钮form2后隐藏但是如何从剪贴板中获取文本并设置为当前单元格? 一旦数据在剪贴板中,然后像Form1.dgView.CurrentCell.Value = System.Windows.Forms.Clipboard.GetText(System.Windows.Forms.TextDataFormat.Text)一样检索它 一个糟糕的解决方案 IMO - 没有必要为此使用剪贴板 我无法将您的解决方案作为答案。但是你的技术帮助了我。如果用户出于其他目的将一些有价值的数据存储在剪贴板中,则此技术将删除此数据。所以我不能用这个。【参考方案4】:

好的,我明白了。 起初我创建了一个名为

的公共变量 公共 UpdateData 作为 String = ""

那就改代码-

Private Sub dg_DataGridEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) 将 dgView 调暗为 DataGridView = DirectCast(sender, DataGridView) Form2.TextBox1.Text = dgView.CurrentCell.Value.ToString() Form2.ShowDialog() dgView.CurrentCell.Value =更新数据 更新数据="" 结束子

在表格2中

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 处理 Button1.Click form1.UpdateData = TextBox2.Text 我.Hide() 结束子

【讨论】:

【参考方案5】:

您可以通过Form2 的构造函数将Form1 的datagridview 传递给Form2。然后你就可以访问Form1的datagridview的CurrentCell,就像你上一个代码sn-p一样。

您可以在Form2 中有一个构造函数,它将datagridview 作为参数。

Public Class Form2

    Private dgView As New DataGridView
    Public Sub New(ByRef _dgView As DataGridView)
        dgView = _dgView
    End Sub

End Class

当您在Form1 中创建Form2 的实例时,将dgView 传递给Form2,如:

Public Class Form1
    Dim Form2 As New Form2(dgView)

End Class

现在当您单击Form2 中的按钮时,只需在按钮事件处理程序中设置dgView 的CurrentCell,如下所示:

dgView.CurrentCell.Value = TextBox2.Text

【讨论】:

以上是关于如何将值从一个表单传递到另一个表单的动态创建的控件的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从mysql传递到创建视图中的表单字段

JSP 将值从表传递到表单

如何使用会话将值从一个php页面传递到另一个页面

如何将值从表单传递到数据表

如何将值从一个组件传递到另一个没有父子关系的库中的组件文件?

如何将值从mysql传递到create视图中的表单域