【问题标题】:VB.net opening and closing formsVB.net开闭表格
【发布时间】:2013-08-17 07:47:03
【问题描述】:

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

【问题讨论】:

    标签: vb.net winforms


    【解决方案1】:

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

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

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

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

    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
    

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

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

    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 在项目属性(解决方案资源管理器中的“我的项目”)中被指定为“启动表单”。你要么必须:

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

    【讨论】:

    • 非常感谢它有效。非常感谢您提供有关表格使用的所有其他信息。我不能要求更多。
    【解决方案2】:

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

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

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

    【讨论】:

    • 您关于项目 + 属性、应用程序选项卡的指南真的救了我。我不知道你必须在那里编辑一些东西。我在没有那种设置的情况下使用 VB6。非常感谢。我还在适应 VB.net 环境
    【解决方案3】:

    我也有类似的问题。当你 .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

    【讨论】:

      【解决方案4】:
      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

      【讨论】:

        【解决方案5】:

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

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

        使用 Shown 事件。

        并使用 ShowDialog()

            Form1.ShowDialog()
        

        【讨论】:

        • 这样做有什么好处? Shown 事件仅在表单显示的第一次 时间引发,因此它的工作方式与Load 非常相似。唯一的区别是引发两个事件的顺序。你为什么会推荐ShowDialog?在我看来,他不想要一个阻塞模式对话框,所以这将是一个糟糕的选择。
        【解决方案6】:

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

        如果有帮助,请回复。

        【讨论】:

        • 这根本行不通,你的逻辑全错了。它不会有所作为! #downVote
        • 这是不正确的。 Me.Hide 关闭表单,它只是隐藏它。也许你在想Me.Close
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多