【问题标题】:What is the best way to detect all ways of closing a form?检测关闭表单的所有方式的最佳方法是什么?
【发布时间】:2013-02-19 17:06:54
【问题描述】:

我有一个表单,我在代码中多次使用End 关闭它。当我这样做时,我想做一个命令来保存设置,称为VarsToIni(),它需要一些公共变量并将它们保存在一个 INI 文件中。我已经尝试将它放在主窗口的 F​​ormClosing 中(始终保持打开状态),这仅在您按下 X 按钮而不是我的 End 语句关闭时才有效。

【问题讨论】:

  • 检测所有关闭表单的方法的最佳方法是不要调用End。只需关闭主窗体。此外,INI 文件是一项遗留技术,如果可能,请尝试使用“我的项目”选项卡中的设置。
  • 显而易见的答案是不要使用End 关闭您的表单。这就是Form.Close 方法的用途。
  • @LarsTech 我不喜欢 My.Settings 的东西,所以决定切换回 INI。它使其他应用程序(如安装程序)更容易阅读。
  • End 语句是粗鲁的中止,与 Environment.Exit() 相同。 Splat,结束,没有事件。不喜欢就不要用了。

标签: vb.net winforms formclosing


【解决方案1】:

添加一个新的 Sub 并将对 End 的调用替换为对您的新 Sub 的调用:

Sub EndMe()
    VarsToIni()
    Application.Exit() 
End Sub

编辑:

正如 Dan 指出的,End() 是关闭应用程序的不好方法,首选 Application.Exit()

【讨论】:

  • 那你还在打电话给End... IMO End Application.Exit() 和Shutdown mode: When startup form closes 。只要您用某些东西替换End 调用,就让它成为Application.Exit() 并更雄辩地处理关闭应用程序,并在主窗体的Closing 事件中使用更多选项/控件。至少其他偶然发现此问答的人不应该不加思索地接受这个答案。
  • @DanVerdolino 我同意并已修改。
【解决方案2】:

考虑使用Application.Exit() 而不是End。这允许无论如何调用FormClosing(您可以根据它的关闭方式来处理它)。

Private Sub frmMain_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    Select Case e.CloseReason
        Case CloseReason.ApplicationExitCall
            ' This is the result of Application.Exit()
            e.Cancel = False
        Case CloseReason.UserClosing
            ' This is the result of clicking the red X
            Select Case MessageBox.Show("Are you sure you wish to exit?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                Case DialogResult.Yes
                    e.Cancel = False
                Case DialogResult.No
                    e.Cancel = True
            End Select
        Case Else
            e.Cancel = False
    End Select
    If Not e.Cancel Then
        VarsToIni()
    End If
End Sub

【讨论】:

    【解决方案3】:

    不过,我对你的问题感到很困惑:
    这将关闭您的所有表单

    For each x as Form in My.Application.OpenForms  
    'You can then put your VarsToIni() here
     x.Close()
    Next
    

    注意:将此添加到您的导入中

    Imports System.Windows.Forms
    

    【讨论】:

    • “我试过把它放在主窗口的 F​​ormClosing 中” 你觉得呢? (是的,我有,但它没有将End 注册为FormClosing。)我使用不同形式的End 是否重要?当我从另一个表单执行End 时,它会关闭我试图检测关闭但不会触发FormClosing 的表单。
    猜你喜欢
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多