VB.net开启和关闭表格

时间:2013-08-17 07:47:04

标签: vb.net winforms

我有一个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()只会隐藏上一个表格而不是完全关闭它。我希望能够关闭以前的表单,以便当我再次打开它时,表单加载事件将再次触发。

6 个答案:

答案 0 :(得分:8)

  

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

这正是发生的事情。只有隐藏来自用户的<{1}}方法,才能使其隐藏。

您正在寻找的是Close method,它实际上会关闭表单。 (由于您使用Hide方法显示表单,因此无需致电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事件,因为您正在创建并显示新表单。

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

Show

运行此代码时,您可能会立即遇到另一个问题:第一次关闭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被指定为项目属性中的“启动表单”(解决方案资源管理器中的“我的项目”)。你要么必须:

  • 创建第三个​​表单以用作“主”表单,并将“启动表单”设置为此第三个表单,或
  • 将“关闭模式”(也在“我的项目”中)从“当启动表单关闭时”更改为“当最后一个表单关闭时”。

答案 1 :(得分:4)

  

我猜对了Me.Hide()只会隐藏上一个表格而不是完全关闭它

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

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

答案 2 :(得分:0)

我也有类似的问题。当u .Hide()你只是把它存放在某个地方的内存中时,当它被重新打开时,它不必让一个新形式只是从内存中回忆一个,因此该方法不再被调用。你必须破坏表格。因此,当您导航到另一个表单时,您可以首先转到该表单然后销毁当前表单,如此Form2.Show()
Me.Close()。看看我的问题和我接受的答案。如果有效,请不要忘记将此作为您接受的答案。
When my form is hidden and reloaded from another form it is not executing the code in the Load event

答案 3 :(得分: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

答案 4 :(得分:-1)

是。你正在做的是在打开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

你需要投入:

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

如果有此帮助,请回复。

答案 5 :(得分:-1)

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

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

使用显示的事件。

并使用ShowDialog()

    Form1.ShowDialog()