是的,noob问题。道歉。
当用户点击窗口上的红色x按钮时,我想弹出一条消息,询问他们是否真的想要退出。我在此网站上发现了类似的问题:Override standard close (X) button in a Windows Form。
问题是,我想为MessageBox自定义字体和MessageBoxIcon,遗憾的是它无法完成(或者需要付出很多努力才能完成)。所以,我决定制作自己的表格。
protected override void OnFormClosing(FormClosingEventArgs e)
{
if (txtID.Text != "" || txtPassword.Text != "")
{
base.OnFormClosing(e);
if (e.CloseReason == CloseReason.WindowsShutDown) return;
// Confirm user wants to close
new formConfirmExit().ShowDialog();
}
}
我在主窗体下添加了此代码。但是,当我运行我的代码并单击标准关闭按钮时,我的弹出窗口(我所做的自定义表单)并没有完成它的工作。假设我单击"否"按钮,它终止了我的整个程序。随着"是"按钮,弹出窗口再次显示,然后一切都有点停止(在Visual Studio上)和ta-da!例外。
顺便说一句,这些是Yes和No按钮方法(来自我的自定义表格'类):
private void btnYes_Click(object sender, EventArgs e)
{
Application.Exit(); // terminate program (exception is in here)
}
private void btnNo_Click(object sender, EventArgs e)
{
this.Close(); // close this pop up window and go back to main window
}
将Application.Exit()
更改为Environment.Exit(0)
完成了Yes按钮的作业,但是我的No按钮终止了该程序。
编辑:当我点击是按钮时,弹出/我的自定义表单再次显示(只有一次)。它将保持该状态(我可以反复点击Yes按钮但没有任何反应)。首先单击Yes按钮(注意本段的第一句)然后单击No按钮,抛出InvalidOperationException。
谢谢。
答案 0 :(得分:0)
在No_Click中添加:
private void btnNo_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.No;
}
然后,将表单结束事件更改为以下内容:
protected override void OnFormClosing(FormClosingEventArgs e)
{
if (txtID.Text != "" || txtPassword.Text != "")
{
base.OnFormClosing(e);
if (e.CloseReason == CloseReason.WindowsShutDown
|| e.CloseReason == CloseReason.ApplicationExitCall)
return;
// Confirm user wants to close
using(var closeForm = new formConfirmExit())
{
var result = closeForm.ShowDialog();
if (result == DialogResult.No)
e.Cancel = true;
}
}
}
首先,它检查表单是否通过Application.Exit()
关闭,这可能是从您的其他表单触发的,因此它不会重新显示自定义MessageBox。
其次,在自定义表单周围创建一个using语句。这样您就可以保留值。然后,如果用户不想取消,则将对话结果设置为no
。如果是这种情况,请将e.Cancel = true
设置为停止退出。