您可以像这样使用FormClosing 事件:
private void FormTest_FormClosing(object sender, FormClosingEventArgs e)
{
if ( ThereAreUnsavedChanges )
switch ( MessageBox.Show("Message",
Text,
MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question) )
{
case DialogResult.Yes:
DoSave();
break;
case DialogResult.No:
break;
case DialogResult.Cancel:
e.Cancel = true;
break;
}
}
您可以使用自定义表单而不是消息框:
private void FormTest_FormClosing(object sender, FormClosingEventArgs e)
{
if ( ThereAreUnsavedChanges )
switch ( new SaveDataQueryBox().ShowDialog() )
{
case DialogResult.Yes:
DoSave();
break;
case DialogResult.No:
break;
case DialogResult.Cancel:
e.Cancel = true;
break;
}
}
在此表单中,您将根据用户选择分配 DialogResult 属性。
-
在按钮中保存点击事件:
DialogResult = DialogResult.Ok;
Close();
-
在按钮退出点击事件中:
DialogResult = DialogResult.No;
Close();
-
在按钮中取消点击事件:
DialogResult = DialogResult.Cancel;
Close();
对于结束会话,你可以在InitializeComponents之后的构造函数中添加这个:
SystemEvents.SessionEnding += SessionEnding;
在类中添加:
private bool IsSessionEnding;
private void SessionEnding(object sender, SessionEndingEventArgs e)
{
IsSessionEnding = true;
Close();
}
因此FormClosing 将是:
private void FormTest_FormClosing(object sender, FormClosingEventArgs e)
{
if ( IsSessionEnding)
// Decide if you want to auto save or not
else
if ( ThereAreUnsavedChanges )
switch ( MessageBox.Show("Message",
Text,
MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question) )
{
case DialogResult.Yes:
DoSave();
break;
case DialogResult.No:
break;
case DialogResult.Cancel:
IsSessionEnding = false;
e.Cancel = true;
break;
}
}
如果您不这样做,当会话结束时,系统会提示用户并阻止操作系统,看到应用无响应消息框,除非它设置为强制进程终止。
为确保所有表单都将关闭,您可以使用此方法:
private void CloseForms()
{
foreach ( Form form in Application.OpenForms )
if ( form != this && form.Visible )
try
{
form.Close();
}
catch
{
}
}
例如,您可以从 FormClosed 事件中调用它。