它可以通过两种形式输入特定交易的所有信息。我希望能够在这两种形式之间来回切换,以保留在每种形式上输入的内容,直到单击“保存”按钮为止。
我认为我应该能够使用Form2.Show,Me.Hide,然后再使用Form1.Show,Me.Hide。我第一次去Form2时会经过Form2加载事件(这是合理的),但是对Form1上控件内容的任何了解都已经丢失了。即使Form1隐藏(而不是关闭),其控件的内容也消失了。为什么?
第二次我去Form2时,不会触发加载事件,因为Form2被隐藏了,此时所有Form1控件的内容都可用。因此,在Form1和Form2之间来回切换时,第二次访问Form2后,它可以按我的意愿工作。但是,我需要它在第一次和每次工作。
几天来,我一直试图理解这一点。我已经注释掉几乎每一行代码,一步步遍历代码,谷歌搜索直到脸色发青(对此有很多文章),但我仍然不知道为什么会发生这种行为。
谁能解释这个现象?或者更好的告诉我要完成这项工作需要做什么。
我在转到Form2的Form1按钮后面有此代码
If Form2 Is Nothing Then
Dim Form2 As New Form2
End If
Form2.Show()
Me.Hide()
并将此代码隐藏在Form2按钮后面,以返回到Form1
Form1.Show
Me.Hide
这可能就是您所缺少的:
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使用您在使用构造函数之前显示的技巧传递了引用:
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中。如果您在表单/类级别执行此操作,则它具有表单/类级别的范围。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句