我创建了2个表单。 第一个是您要备份的按钮。 在第二个中,有可以修改的路径。 如何在按下“备份”按钮后进行引用将获得2个表单的路径。 关闭form2时保存路径 我知道如何以一种形式做到这一点,但不幸的是我不能引用另一种形式。
表格2的来源:
activity flag
答案 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
最好不来创建自己的构造函数,直到您熟悉它们为止。使用代码窗口顶部的下拉菜单:从左侧选择表单名称;从右侧选择新建。设计者将必需的代码添加到它们中,不得更改。
不要在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
结果:
多数民众赞成,但如果有很多数据可以变得麻烦。另外,您可能希望更新来自主叫/主表单的一些数据。为此,您可以在表单上创建' 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
结果:
对于基于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