Vb.net 如何将窗体、对象或数据传递给第二个窗体
我已经创建了两个表单。 第一个是要备份的按钮。 在第二种情况下,存在可以修改的路径。 如何参考按下“备份”按钮后将获得2张表单的路径。 当我关闭form2时,路径被保存 我知道如何用一种形式来做,但不幸的是,我不能参考另一种形式 表格2的来源: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
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