3

我有一个 VB 程序,它有两种形式,我已经编码了每种形式的表单加载。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    MessageBox.Show("I AM FORM 1")
End Sub

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    MessageBox.Show("I AM FORM 2")
End Sub

这是我在 Form1 和 Form2 之间切换的方法,我使用了一个按钮。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Me.Hide()
    Form1.Show()

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Me.Hide()
    Form2.Show()

End Sub

但是每次我切换表单时,表单加载事件只会触发一次。我的代码有问题吗?我猜 Me.Hide() 只会隐藏以前的表单,而不会完全关闭它。我希望能够关闭以前的表单,以便当我再次打开它时,表单加载事件将再次触发。

4

6 回答 6

9

但是每次我切换表单时,表单加载事件只会触发一次。我的代码有问题吗?我猜 Me.Hide() 只会隐藏以前的表单,而不会完全关闭它。

这正是正在发生的事情。该Hide方法只是对用户隐藏表单,有效地使其不可见。

您正在寻找的是Close方法,它实际上关闭了表单。(由于您正在使用该Show方法显示表单,因此您无需调用Dispose。)

但是,您将无法关闭表单并继续在其方法中运行代码。因此,您需要颠倒事件处理函数中语句的顺序,首先显示另一个表单,然后关闭自身。让它们看起来像这样:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Form1.Show()
    Me.Close()    
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Form2.Show()
    Me.Close()
End Sub

那会做你想做的事。Load每次调用该方法时都会触发该事件Show,因为您正在创建并显示一个新表单。

不过,值得指出的是,您依赖的是 VB.NET 的一个不同寻常的特性,出于向后兼容性的原因,它从旧的 VB 语言中保留了这一特性。您不是引用表单类的对象(就像您必须处理所有其他类对象一样),而是通过类型名称(类本身的名称)来引用它。你真的不应该这样做,它会引起各种各样的头痛,并且会让阅读你的代码的人感到困惑。最好只实例化一个新的表单对象,如下所示:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim frm As New Form1  ' create a new Form1 object
    frm.Show()            ' ... and display it

    Me.Close()
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim frm As New Form1  ' create a new Form2 object
    frm.Show()            ' ... and display it

    Me.Close()
End Sub

当您运行这段代码时,您可能会立即遇到另一个问题:第一次关闭Form1时,您的整个应用程序将退出。这是因为,默认情况下,新项目Form1在项目属性(解决方案资源管理器中的“我的项目”)中被指定为“启动表单”。您要么必须:

  • 创建第三个表单用作“主”表单,并将“启动表单”设置为此第三种表单,或
  • 将“关闭模式”(也在“我的项目”中)从“启动表单关闭时”更改为“最后一个表单关闭时”。
于 2013-08-17T09:14:00.627 回答
4

我猜 Me.Hide() 只会隐藏以前的表单而不是完全关闭它

是的,它按照它说的做。如果要关闭表单,请改用 Me.Close()。当您创建新实例时,Load 事件将再次触发。

您必须更改设置以确保不会关闭您的应用程序。项目 + 属性,应用程序选项卡,将关闭模式设置更改为“最后一个表单关闭时”。并将 Me.Close() 调用放在 Show() 调用之后。

于 2013-08-17T09:16:57.187 回答
0

我也有类似的问题。当.Hide()你只是将它存储在内存中的某个地方时,当它重新打开时,它不必创建一个新表单,只需从内存中调用一个,因此不会再次调用该方法。你必须销毁表格。因此,当导航到另一个表单时,您可以做的是先转到该表单,然后像这样销毁当前表单
Form2.Show()
Me.Close()。看看我的问题和我接受的答案。如果可行,请不要忘记将此作为您接受的答案。
当我的表单被隐藏并从另一个表单重新加载时,它不会执行 Load 事件中的代码

于 2013-08-17T09:13:17.313 回答
0
If MessageBox.Show("Are you sure to close this application?", "Close", 
    MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
    frmIndex.Show() //the main form 
Else
    e.Cancel = True
    Me.Show() // The form open
End If

表单打开关闭并返回主/索引表单。希望它有所帮助:) 只需使用.show, .hide 和 e.cancel

于 2016-03-10T11:29:45.927 回答
-1

是的。您正在做的是在打开表单2之前关闭表单。

代替:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Me.Hide()
    Form1.Show()

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Me.Hide()
    Form2.Show()

End Sub

你需要把:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Form1.show

Me.hide 

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Form2.show

Me.hide   

End Sub

如果这有帮助,请回复。

于 2013-08-17T08:42:55.313 回答
-1

我认为您使用的是愚蠢的结构,但您应该这样做;

     Private Sub Form2_Shown(sender As Object, e As EventArgs) Handles Me.Shown
          Form1.close()
     End Sub

使用显示事件。

并使用 ShowDialog()

    Form1.ShowDialog()
于 2013-08-17T08:46:16.670 回答