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