当用户单击标题栏中的十字时,如何显示MessageBox提示

我目前正在开发一个C#Windows窗体应用程序。

用户通过loginForm登录后,它将被带到mainForm。

我想用一种方式编写代码,用户点击mainForm标题栏上的十字后,会有一个提示询问用户“这将关闭应用程序。确认?” 然后是是和否按钮。

如果是,将显示另一个框,“申请已关闭!”

如果不是,消息框将关闭,应用程序将继续运行。

我目前的代码是:

private void mainForm_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes) { MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK); System.Windows.Forms.Application.Exit(); } else { this.Activate(); } } 

但它不起作用。

首先,我不知道为什么消息框弹出两次以便整个事情关闭。

其次,如果我点击否,表格也会关闭,我无法将其恢复。

要取消关闭表单,在else语句中需要e.Cancel = true; 。 在真实情况下,您不需要显式Exit。

试一试

 private void mainForm_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes) { MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK); } else { e.Cancel = true; this.Activate(); } } 

我假设您的第二个MessageBox说它已关闭,仅用于测试目的。

你可能只想要。

 private void mainForm_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) != DialogResult.Yes) { e.Cancel = true; } } 

请注意,该语句会检查它们是否未命中,而不是它们是否取消。 这意味着如果他们点击对话框中的x,则不会将其视为确认。

编辑:如果mainForm不是主要forms

好的,我想我现在已经得到了你的要求。

我要做的是将我在上面的第二个代码块中的代码放在FormClosing中,然后在FormClosed事件处理程序中有这个

 private void mainForm_FormClosed(Object sender, FormClosedEventArgs e) { MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK); System.Windows.Forms.Application.Exit(); } 

这应该对你有帮助

 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("Are you sure you want to close?", "Close", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No) e.Cancel = true; } 

要获得所需的function,请尝试使用以下代码:

 private void mainForm_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes) { MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK); //no need to do anything here. } else { e.Cancel = true; } } 

你应该在FormClosingEventArgs寻找取消属性:这应该工作:

  private void mainForm_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes) { MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK); } else { e.Cancel = true; } } 

http://msdn.microsoft.com/en-us/library/system.windows.forms.formclosingeventargs.aspx

这将满足您的需求:

 private void mainForm_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes) { MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK); } else { e.Cancel = true; } } 

编辑:回答你的第一个问题,看看这个 。 当您在应用程序中调用Exit()时,将为所有打开的表单(包括mainForm (仍处于打开状态))引发FormClosing事件,因此事件将被引发两次。 通常我会期望这样的事情导致无限递归和文字堆栈溢出,但我认为.NET足够聪明以防止这种情况。

在相关的说明中,你应该通过调用Exit()关闭你的程序 – 这是一种代码味道。

 var GetInput = MessageBox.Show("Do you want to Delete?", "Confirm Deletion",MessageBoxButton.OKCancel); if (GetInput == MessageBoxResult.OK) { //do what you like } 

你的代码完美适合我,没有错误。

 private void exiteProToolStripMenuItem_Click(object sender, EventArgs e) { if (MessageBox.Show("message", "title", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { Application.Exit(); } else { this.Activate(); } }