如何将表单,对象或数据传递给第二个表单

时间:2017-10-21 13:40:17

标签: vb.net reference

我创建了2个表单。 第一个是您要备份的按钮。 在第二个中,有可以修改的路径。 如何在按下“备份”按钮后进行引用将获得2个表单的路径。 关闭form2时保存路径 我知道如何以一种形式做到这一点,但不幸的是我不能引用另一种形式。

表格2的来源:

activity flag

2 个答案:

答案 0 :(得分:3)

您不希望创建对表单的引用 - 这将(或可能)创建一个全新的表单。您想要保留表单引用。

这是通过传递对表单的引用来完成的,但是对于另一个表单上的控件的一种形式的讨论是一个坏主意,因为它破坏了封装。但表单是类(它在每个表的顶部都是这样),因此您可以添加属性方法Sub和/或{{1} s)便于来回传递信息。

方法一 - 传递表单参考

最简单的方法是传递构造函数中其他形式所需的内容:

Function

为了使其正常工作,您需要修改目标表单上的构造函数(' form 1 / "main" form / form to return to Dim frm As New Form6(Me) frm.Show() Me.Hide() ):

Sub New

最好来创建自己的构造函数,直到您熟悉它们为止。使用代码窗口顶部的下拉菜单:从左侧选择表单名称;从右侧选择新建。设计者将必需的代码添加到它们中,不得更改。

enter image description here

不要Private frmReturnTo As Form Public Sub New(f As Form) ' This call is required by the designer. InitializeComponent() frmReturnTo = f End Sub 调用之前添加任何代码,至少在您熟悉表单的生命周期之前。在运行之前,表单及其控件不存在。

返回" main"形式:

InitializeComponent()

您可能希望删除部分标题栏按钮或将代码添加到表单If frmReturnTo IsNot Nothing Then frmReturnTo.Show() End If 事件中,以便在用户通过系统菜单或按钮关闭时进行处理。

使用构造函数非常适用于存在必须具有形式的一些数据才能完成其工作的情况。

方法二 - 传递数据

这一切都很好,但是将数据传递给另一个表单怎么样?您也可以使用构造函数。为了传递say,一个字符串,整数和Closing

Point

这样称呼:

' 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

结果:

enter image description here

方法三:属性

多数民众赞成,但如果有很多数据可以变得麻烦。另外,您可能希望更新来自主叫/主表单的一些数据。为此,您可以在表单上创建' method two: pass data you want to share in the ctor Dim frm As New frmData("hello", 6, New Point(150, 550)) frm.Show() 来处理数据:

Properties

使用其中一个控件而不是私有变量作为支持字段。该名称留下了一些需要,因为它暴露了实现细节。因此,使用描述代表的数据的名称而不是显示的位置。

Public Property Label1Text As String
    Get
        Return Me.Label1.Text
    End Get
    Set(value As String)
        Me.Label1.Text = value
    End Set
End Property

仅使用Public Property SpecialValue As Integer Get Return Integer.Parse(Me.Label2.Text) End Get Set(value As Integer) Me.Label2.Text = value.ToString End Set End Property Public Property SomePoint As Point Get Dim data = Me.Label3.Text.Split(","c) Return New Point(Convert.ToInt32(data(0)), Convert.ToInt32(data(1)) ) End Get Set(value As Point) Me.Label3.Text = value.X.ToString & "," & value.Y.ToString End Set End Property 来表明可以使用其他数据类型。从调用/原始/源表单设置这些值:

point

目标控件很可能是TextBoxes供用户编辑。 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 "包装"允许您返回这些值,因此在这种情况下,使用Property

方法四:方法

您还可以使用方法将数据传递给第二个/辅助表单。这里将传递Dialog集合。在子/显示表单中,添加一个方法来接收随后显示的数据。表示的任务是校对或查看已过滤的列表:

List(of 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

结果:

enter image description here

对于基于DataBased的应用程序,修改后的版本可以允许您在另一个表单上以详细形式显示DataGridView数据。你不需要第二个表格梯级SQL来添加或更新记录,然后运行另一个查询的主表单去"刷新"显示器。如果' 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 是由完全配置的DataSource备份的DataTable,请传递DataTable并使用该表单添加,更改或删除子表单。数据将自动位于DataAdapter DataGridView`。

还有其他方法可以做到这一点,但它们通常都归结为将一些东西从A传递给B.哪种方式最好"取决于应用程序的功能,用例和数据的性质。没有一种正确的方法或最好的方式。

例如,DataTable and并且在许多情况下Properties允许B表单关闭反馈循环。对于DB项,Functions属性可能会告知调用表单数据已添加或更改,以便表单知道使用DataChanged来更新数据库。

答案 1 :(得分:-1)

'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