Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何将窗体、对象或数据传递给第二个窗体_Vb.net_Reference - Fatal编程技术网

Vb.net 如何将窗体、对象或数据传递给第二个窗体

Vb.net 如何将窗体、对象或数据传递给第二个窗体,vb.net,reference,Vb.net,Reference,我已经创建了两个表单。 第一个是要备份的按钮。 在第二种情况下,存在可以修改的路径。 如何参考按下“备份”按钮后将获得2张表单的路径。 当我关闭form2时,路径被保存 我知道如何用一种形式来做,但不幸的是,我不能参考另一种形式 表格2的来源: Private Sub Browser_from1_Click(sender As Object, e As EventArgs) Handles Browser_from1.Click Dim FolderBrowserDialog1

我已经创建了两个表单。 第一个是要备份的按钮。 在第二种情况下,存在可以修改的路径。 如何参考按下“备份”按钮后将获得2张表单的路径。 当我关闭form2时,路径被保存 我知道如何用一种形式来做,但不幸的是,我不能参考另一种形式

表格2的来源:

Private Sub Browser_from1_Click(sender As Object, e As EventArgs) Handles Browser_from1.Click
        Dim FolderBrowserDialog1 As New FolderBrowserDialog
        FolderBrowserDialog1.ShowDialog()
        TextBox1from.Text = FolderBrowserDialog1.SelectedPath

        If Browser_from1.Text <> "" And TextBox1from.Text <> "" Then
            Backup.StartCopy.Enabled = True

        End If

    End Sub

    Private Sub Browser_to1_Click(sender As Object, e As EventArgs) Handles Browser_to1.Click
        Dim FolderBrowserDialog1 As New FolderBrowserDialog
        FolderBrowserDialog1.ShowDialog()
        TextBox2to.Text = FolderBrowserDialog1.SelectedPath

        If Browser_to1.Text <> "" And TextBox2to.Text <> "" Then
            Backup.StartCopy.Enabled = True

        End If
    End Sub

    Private Sub TextBox1from_TextChanged(sender As Object, e As EventArgs) Handles TextBox1from.TextChanged

    End Sub

    Private Sub save_settings_Click(sender As Object, e As EventArgs) Handles save_settings.Click
        My.Settings.pathmem = TextBox2to.Text
        My.Settings.pathmem1 = TextBox1from.Text
        My.Settings.Save()
    End Sub

    Private Sub setting_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1from.Text = My.Settings.pathmem1
        TextBox2to.Text = My.Settings.pathmem
    End Sub
End Class
Private Sub Browser\u from 1\u Click(发件人作为对象,e作为事件参数)处理浏览器\u from 1。Click
Dim FolderBrowserDialog1作为新FolderBrowserDialog
FolderBrowserDialog1.ShowDialog()
TextBox1from.Text=FolderBrowserDialog1.SelectedPath
如果浏览器_来自1.Text“”和TextBox1from.Text“”,则
Backup.StartCopy.Enabled=True
如果结束
端接头
私有子浏览器\u to1\u Click(发送者作为对象,e作为事件参数)处理浏览器\u to1。Click
Dim FolderBrowserDialog1作为新FolderBrowserDialog
FolderBrowserDialog1.ShowDialog()
TextBox2to.Text=FolderBrowserDialog1.SelectedPath
如果浏览器_为1.Text“”,TextBox2为.Text“”,则
Backup.StartCopy.Enabled=True
如果结束
端接头
私有子TextBox1from_TextChanged(发送者作为对象,e作为事件参数)处理TextBox1from.TextChanged
端接头
私有子保存设置\u单击(发件人作为对象,e作为事件参数)处理保存设置。单击
My.Settings.pathmem=TextBox2to.Text
My.Settings.pathmem1=TextBox1from.Text
My.Settings.Save()
端接头
私有子设置_Load(发送者作为对象,e作为事件参数)处理MyBase.Load
TextBox1from.Text=My.Settings.pathmem1
TextBox2to.Text=My.Settings.pathmem
端接头
末级
您不想创建对表单的引用-这将(或可能)创建一个全新的表单。您希望保留表单引用

这是通过传递对表单的引用来实现的,但是一个表单摆弄另一个表单上的控件是一个坏主意,因为它破坏了封装。但是表单是类(在每个表单的顶部都有这样的说明),因此您可以添加属性和方法(
Sub
和/或
Function
s),以方便来回传递信息

方法一-传递表单引用 最简单的方法是在构造函数中传递其他表单所需的任何内容:

' form 1 / "main" form / form to return to

Dim frm As New Form6(Me)

frm.Show()
Me.Hide()
为了使其工作,您需要修改目标表单上的构造函数(
Sub-New
):

Private frmReturnTo As Form
Public Sub New(f As Form)
    ' This call is required by the designer.
    InitializeComponent()

    frmReturnTo = f

End Sub
在熟悉构造函数之前,最好不要创建自己的构造函数。使用代码窗口顶部的下拉列表:从左侧选择表单名称;从右侧,选择新建。设计器向它们添加所需的代码,这些代码不能更改

至少在熟悉表单的生命周期之前,不要在
InitializeComponent()
调用之前添加任何代码。窗体及其控件在运行之前不存在

要返回“主”窗体,请执行以下操作:

当用户通过系统菜单或按钮关闭时,您可能需要删除一些标题栏按钮或向表单
关闭
事件中添加代码

如果表单必须有一些数据位才能完成其工作,则使用构造函数非常理想

方法二:传递数据 这很好,但是将数据传递到另一个表单呢?您也可以使用构造函数来实现这一点。为了传递(比如)字符串、整数和

' destination / second form:
Public Sub New(a As String, b As Int32, c As Point)
    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    Label1.Text = a
    Label2.Text = b.ToString
    Label3.Text = c.ToString

End Sub
可以这样称呼:

' method two: pass data you want to share in the ctor
Dim frm As New frmData("hello", 6, New Point(150, 550))

frm.Show()
结果:

方法三:属性 这很好,但如果有大量数据,这种方法可能会变得很麻烦。另外,您可能需要更新调用/主窗体中的一些数据。为此,您可以在表单上创建
属性
,以处理数据:

Public Property Label1Text As String
    Get
        Return Me.Label1.Text
    End Get
    Set(value As String)
        Me.Label1.Text = value
    End Set
End Property
使用其中一个控件,而不是用作支持字段的专用变量。由于该名称公开了实现细节,因此有点不尽如人意。因此,使用描述数据表示内容的名称,而不是数据显示的位置

使用
只是为了表明可以使用其他数据类型。从调用/原始/源窗体设置这些值:

Using frm As New Form6
    frm.Label1Text = "Ziggy"
    frm.SpecialValue = 42
    frm.SomePoint = New Point(111, 222)

    frm.ShowDialog()

    ' do stuff here with any changes
    Dim theint = frm.SpecialValue

End Using          ' dispose of dialog
目标控件很可能是供用户编辑的文本框。
属性
“包装器”允许您取回这些值,因此在本例中,使用了一个
对话框

方法四:方法 您还可以使用方法将数据传递给第二个/helper表单。这里将传递一个
列表(共T个)
集合。在子/显示窗体中,添加了一个方法来接收数据,然后显示数据。表示的任务是校对或查看筛选列表:

Public Sub UpdateDisplay(lst As List(Of SimpleItem), filter As String)
    DataGridView1.DataSource = lst
    Label1.Text = String.Format("{0} Total {1} Items", lst.Count, filter)
End Sub
在主/主叫表格中:

' form level variable
Private frmDV As frmDataView
其他地方…可能在点击事件中:

' myList is a simple list of items
' Users pick which color to filter on via a combo box

Dim filter As String
If cboListFilter.SelectedItem IsNot Nothing Then
    'Dim frmDV As New frmDataView
    If frmDV Is Nothing OrElse frmDV.IsDisposed Then
        frmDV = New frmDataView
    End If

    filter = cboListFilter.SelectedItem.ToString()
    ' apply the filter
    Dim tmpList = myList.Where(Function(w) w.Color = filter).ToList()
    frmDV.UpdateDisplay(tmpList, filter)

    frmDV.Show()
Else
    Return

End If
结果:

对于基于数据的应用程序,此应用程序的修改版本允许您在另一个表单上显示DataGridView详细表单中的数据。您不需要第二个表单rung SQL来添加或更新记录,然后主表单运行另一个查询来“刷新”显示。如果
数据源
是一个由完全配置的
数据适配器
备份的
数据表
,则传递该数据表,并让子表单使用该数据表添加、更改或删除。数据将自动保存在
DataTable和
DataGridView`中


还有其他方法可以做到这一点,但它们通常都归结为从A到B传递某些信息。哪种方法“最好”取决于应用程序的功能、用例和数据的性质。没有一个正确的方法或最好的方法

例如,
属性
和在许多情况下
函数
允许B表单关闭反馈循环。对于DB项,一个
DataChanged
属性可能会告诉调用表单数据已添加或更改
' form level variable
Private frmDV As frmDataView
' myList is a simple list of items
' Users pick which color to filter on via a combo box

Dim filter As String
If cboListFilter.SelectedItem IsNot Nothing Then
    'Dim frmDV As New frmDataView
    If frmDV Is Nothing OrElse frmDV.IsDisposed Then
        frmDV = New frmDataView
    End If

    filter = cboListFilter.SelectedItem.ToString()
    ' apply the filter
    Dim tmpList = myList.Where(Function(w) w.Color = filter).ToList()
    frmDV.UpdateDisplay(tmpList, filter)

    frmDV.Show()
Else
    Return

End If
'SECOND FORM

Public class secondForm (blah blah)
Public overloads property owner as myMainForm
'Must be only the form you prepared for that 

Private sub secondForm_load(blah blah) handles blah blah
Texbox1.text=Owner.customcontrol.text
End sub

End class

'MAIN FORM

public class myMainForm(blah blah)

Private sub button1_click(blah blah) handles blah blah

Dim NewSecondForm as secondForm = New secondForm
NewSecondForm.owner(me)
NewSecondForm.show(me)
NewSecondForm.dispose()

' so you can have bidirectional communication between the two forms and access all the controls and properties from each other
End sub
End Class