能够输入特定交易的所有信息需要两种形式。我希望能够在这两种形式之间来回切换,保留每种形式,直到点击“保存”按钮。
我想我应该可以使用Form2.Show,Me.Hide,然后使用Form1.Show,Me.Hide。 我第一次去Form2时,它通过Form2加载事件(这是合理的),但是对Form1上的控件内容的任何了解都已丢失。即使Form1被隐藏(并且未关闭),其控件的内容也会消失。为什么呢?
第二次转到Form2时,加载事件不会触发,因为Form2被隐藏,此时所有Form1控件内容都可用。因此,在Form1和Form2之间来回切换,它在我第二次进入Form2之后就像我想要的那样工作。但是,我需要它第一次和每次都工作。
几天来,我一直试图理解这一点。我已经注释掉几乎所有的代码行,通过代码进行搜索,直到我脸上都是蓝色的(已经写了很多关于此的内容),我仍然无法弄清楚为什么会出现这种情况。
任何人都可以解释这种现象吗?或者更好的是告诉我需要做些什么才能使这项工作。
我在Form1按钮后面有这个代码,转到Form2
If Form2 Is Nothing Then
Dim Form2 As New Form2
End If
Form2.Show()
Me.Hide()
这个代码在Form2按钮后面返回Form1
Form1.Show
Me.Hide
答案 0 :(得分:2)
这是你可能遗失的全部内容:
Class Form1
Private f2 As Form2 ' this is Form1's reference to the
' form2 instance
稍后当您点击转到form2时,您的原始代码只需要进行一些小调整:
If f2 Is Nothing Then
f2 = New Form2(Me) ' set declared variable to new instance
End If
F2.Show()
Me.Hide()
在这种情况下,Form1使用构造函数使用the trick you were shown before传递引用:
Sub New(frm As Form1) ' this is in Form2 only
f1 = frm
End Sub
你不需要在Form1中使用它,因为他/它正在创建自己的f2对象引用。
原始代码中的主要问题是:Dim Form2 As New Form2
。您每次都在创建一个新的Form2(我怀疑它存在于一个事件或子事件中)。那些新的instances
无法知道先前实例中的控件值。如图所示声明F1
或F2
会为其提供模块/表单级别Scope
。
Dim
声明一个变量及其类型。 f1属于Form1类型。如果它是对象变量
New
创建对象类型的实例(引用类型)。这与类中的Sub New
方法直接相关。当您使用New
时,会调用Sub New
,因此可以在那里进行任何特殊操作。像Integer
这样的值类型不需要创建或实例化,只需要声明。
在哪里,您声明(Dim
)变量确定其Scope
。如果在Sub中执行此操作,则变量或对象仅存在于该Sub中。如果你在表单/类级别执行它,它具有表单/类级别范围。
答案 1 :(得分:0)
我会尝试这样的事情。使用ShowDialog方法以模态方式显示2个表单。
在每个表单中,创建一个属性(称为“OtherForm”),该属性指向另一个表单的实例。
通过将任一表单的DialogResult设置为Windows.Forms.DialogResult.Yes
来继续循环。通过将任一表单的DialogResult设置为Windows.Forms.DialogResult.No
来退出循环。这将在每次显示时执行每个表单加载事件。
所以在你所谓的Form0上的按钮点击事件过程中调用它。
Dim Form1 As New Form1
Dim Form2 As New Form2
Dim sFormToShow As String = "Form1"
Form1.OtherForm = Form2
Form1.DialogResult = Windows.Forms.DialogResult.Yes
Form2.OtherForm = Form1
Form2.DialogResult = Windows.Forms.DialogResult.Yes
Do
If sFormToShow = "Form1" Then
Form1.ShowDialog()
ElseIf sFormToShow = "Form2" Then
Form2.ShowDialog()
End If
sFormToShow = IIf(sFormToShow = "Form1", "Form2", "Form1")
Loop While Form1.DialogResult = Windows.Forms.DialogResult.Yes AndAlso Form2.DialogResult = Windows.Forms.DialogResult.Yes
将此属性添加到Form1:
Private _myOtherForm As Form2
Public Property OtherForm() As Form2
Get
Return _myOtherForm
End Get
Set(ByVal value As Form2)
_myOtherForm = value
End Set
End Property
将此属性添加到Form2:
Private _myOtherForm As Form1
Public Property OtherForm() As Form1
Get
Return _myOtherForm
End Get
Set(ByVal value As Form1)
_myOtherForm = value
End Set
End Property
然后,您可以使用_myOtherForm变量从每个表单访问其他表单的所有公共属性和方法。
如果您要从Form1调用它,它将在Form2中的TextBox1中显示文本,反之亦然:
MessageBox.Show(_myOtherForm.TextBox1.Text)
要关闭当前表单,请继续循环并打开另一个表单,将其添加到按钮单击事件过程:
Private Sub btnShowOtherForm_Click(sender As Object, e As EventArgs) Handles btnShowOtherForm.Click
Me.DialogResult = Windows.Forms.DialogResult.Yes
Me.Close()
End Sub
要关闭当前表单,退出循环并停止显示任何其他表单,请将其添加到按钮单击事件过程:
Private Sub btnStopShowingForms_Click(sender As Object, e As EventArgs) Handles btnStopShowingForms.Click
Me.DialogResult = Windows.Forms.DialogResult.No
Me.Close()
End Sub
这两个程序需要添加到每个表单中。