我正在尝试创建一个event handler
,以便当用户选择close
(x)按钮时,它会提示用户保存任何未保存的更改。这是我的C#
代码:
private void CloseFileOperation()
{
// If the Spreadsheet has been changed since the user opened it and
// the user has requested to Close the window, then prompt him to Save
// the unsaved changes.
if (SpreadSheet.Changed)
{
DialogResult UserChoice = MessageBox.Show("Would you like to save your changes?", "Spreadsheet Utility",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
switch (UserChoice)
{
case DialogResult.Yes:
SaveFileOperation();
this.Close();
break;
case DialogResult.No:
this.Close();
break;
case DialogResult.Cancel:
return;
}
}
// If the Spreadsheet hasn't been changed since the user opened it, then
// simply Close the window.
else
this.Close();
}
我创建了用户选择关闭 (x) 按钮时触发的事件处理程序MainFram_FormClosing
。
private void MainFrame_FormClosing(object sender, FormClosingEventArgs e)
{
// Close the Spreadsheet.
CloseFileOperation();
}
每当我选择关闭按钮时,应用程序都会崩溃。我已经阅读了this
帖子的回复。我想我违反了Windows 7 Program Requirements
.我想我不明白为什么这个功能不能这么容易地完成。
最好的方法是什么?
如果您使用事件处理程序本身而不是单独的例程,则可以访问 FormClosesingEventArgs,这将允许您在必要时取消关闭。 此外,您正在使用 this.Close();
,它只是重新启动事件,而不是返回并让事件完成。 当我使用此代码集作为事件处理程序时,它按预期在 Win7 上工作:
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
if(SpreadSheet.Changed)
{
switch(MessageBox.Show("Would you like to save your changes?", "Spreadsheet Utility",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning))
{
case DialogResult.Yes:
SaveFileOperation();
return;
case DialogResult.No:
return;
case DialogResult.Cancel:
e.Cancel = true;
return;
}
}
}
我的回答是:
1.不要调用this.close()函数,因为你已经在关闭事件中。
2.如果要更改关闭事件操作(关闭或不关闭),只需将FormClosesingEventArgs参数(下面的代码中的e)属性取消设置为true以取消关闭或false以关闭。
3.如果未保存工作表,则无需执行任何操作,在这种情况下,表单应在不提示的情况下关闭。 因此,您可以忽略 else 块。
这里修改后的代码是:
if (SpreadSheet.Changed)
{ DialogResult UserChoice = MessageBox.Show("Would you like to save your changes?", "Spreadsheet Utility",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Warning); switch (UserChoice) { case DialogResult.Yes: SaveFileOperation(); break; case DialogResult.No: break; case DialogResult.Cancel: e.Cancel = true; break;