在表单之间翻转时如何保留表单的控件值

时间:2014-05-10 11:48:51

标签: vb.net winforms

能够输入特定交易的所有信息需要两种形式。我希望能够在这两种形式之间来回切换,保留每种形式,直到点击“保存”按钮。

我想我应该可以使用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

2 个答案:

答案 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无法知道先前实例中的控件值。如图所示声明F1F2会为其提供模块/表单级别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

这两个程序需要添加到每个表单中。