【问题标题】:Terminate program when Close button is Clicked after Prompt - Visual Basic提示后单击关闭按钮时终止程序 - Visual Basic
【发布时间】:2016-02-23 13:50:14
【问题描述】:

我的WindowsFormApplication 中有两个表单,分别命名为 Form1 和 Form2。这个想法是当程序关闭时,它会显示一个对话框来确认它。

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

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        MessageBox.Show("You are About to cancel the Setup.","Cancel Setup?",
        MessageBoxButtons.OK,
        MessageBoxIcon.Exclamation,
        MessageBoxDefaultButton.Button1)
    End Sub 
End Class

直到这里,我的代码工作正常,但问题是当我单击 Button1 时,出现消息框以确认 Form1 的关闭。

我不希望这种情况发生,所以我尝试将Me.Close() 更改为Me.Hide。我成功阻止了消息框的出现,但后来又遇到了另一个问题。当表单隐藏时,它在后台保持活动状态,我也不希望这种情况发生。

我在Form1_FormClosing 中添加的另一件事是Me. CloseForm2.Close。一旦程序的活动表单被关闭,这可以关闭两个表单。但同样,有一个问题。一旦我单击关闭按钮,消息框就会填满屏幕并且不听我的命令。有人对此有解决方案吗?

【问题讨论】:

  • 首先,为什么会有那个消息框?您不会询问用户是否真的要取消设置,您只需通知他们他们已经取消设置,他们所能做的就是单击“确定”,因此这并不是与该情况真正相关的对话框。在此处说明您要实现的目标,有人可以提供更好的解决方案。
  • 当您执行此操作时,现在 Form2 的工作就是显示“您确定”消息。因此,您需要一个布尔类型的变量来抑制消息框,在 Click 事件处理程序中将其设置为 True。请考虑将 ShowDialog() 作为常用的替代方法,以便您的 Form1 保持“主窗口”。或者“向导”风格用户界面的简单替代方案,TabControl without visible tabs。或者只是两个 UserControls 和一个表单,使用它们的 Visible 属性。
  • 此代码适用于所有表单(Form1 - Form4),如果可能,您能否在代码中提供改进的答案支持?
  • 是的,可能会发生很多错误。如果用户错误地单击了关闭按钮并且他们在程序中取得了巨大的进步,他会感到筋疲力尽。这就是为什么我想在我的程序中包含救生消息框。
  • 这就是为什么我说您应该询问用户是否要取消设置并让他们选择按是或否并对他们的回答做出反应。现在您只需告诉他们他们'已取消,他们所能做的就是单击“确定”。但我同意@Hans,您应该在一个表单上执行此操作,并随着用户的进展切换到不同的面板或选项卡。

标签: vb.net visual-studio


【解决方案1】:

所以..

如果用户在Form1 中单击关闭,则程序应终止且没有消息框。

如果用户时钟在Form2Form3Form4 中关闭,程序将在用户单击MessageBox 中的Yes 时终止,否则不会受到任何影响(尤其是数据)。


这种工作方式是,当用户在Form1 中单击关闭时,程序将在没有MessageBox 的情况下终止,如果用户在其他Forms 中单击关闭,则会出现MessageBox,询问您是否确定要关闭该程序。如果用户单击“是”,程序将终止,因为DialogResult 为“是”且Form1.Closing 取消变为“假”并关闭Form1(由于在程序属性中将关闭类型设置为第一个表单关闭,这将终止程序)否则,Form1.Closing Cancel 将变为 True,这将防止当前表单关闭并丢失任何数据。


此代码转到Form1

Imports System.ComponentModel


Public Class Form1
    Friend closeProgramAlreadyRequested As Boolean = False

    Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
        closeProgramAlreadyRequested = False
    End Sub
End Class

此代码转到Form2 并适用于其他Forms,但Form1 除外:

Imports System.ComponentModel

Public Class Form2
    Private Sub Form2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    If Form1.closeProgramAlreadyRequested = False Then
        Dim result As DialogResult = MessageBox.Show("You are About to cancel the Setup.", "Cancel Setup?", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
        If result = DialogResult.No Then
            e.Cancel = True
        Else
            e.Cancel = False
            Form1.Close()
        End If
    End If
End Sub
End Class

【讨论】:

  • 这是针对单一表格的。一旦用户在MessageBox 中单击Yes,我想终止整个程序。
  • OK so.. 如果有人在任何表单上单击关闭,您希望弹出警告消息,如果他们单击是,则关闭整个应用程序。
  • 哦对了,在你原来的帖子里,你说你不想让form1隐藏,而是关闭?不幸的是,如果您关闭 Form1,整个程序将关闭。要使其他表单保持打开状态,只能隐藏 Form1。
  • 我只是想在我的问题中解释我的代码。一旦用户关闭打开的表单,我希望整个程序终止。 form1 是隐藏还是关闭都没有关系,因为我可以将关闭类型更改为“第一个表单关闭”或“最后一个活动表单关闭”。
  • 好的。让我看看我有没有这个。如果只打开了Form1,并且用户单击了关闭,那么程序应该会在没有提示的情况下终止。如果您打开了其他表单,并且用户单击关闭Form1 或任何其他表单,您希望出现一个消息提示,如果用户选择是,则整个程序终止。如果用户单击否,则不会关闭任何表单。听起来对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多