用于关闭Windows窗体应用程序的事件处理程序

时间:2013-11-01 03:52:25

标签: c# winforms forms validation savechanges

我正在尝试创建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。我想我不明白为什么这个功能不能轻易完成。

这方面最好的方法是什么?

2 个答案:

答案 0 :(得分:5)

如果您使用事件处理程序本身而不是单独的例程,则可以访问FormClosingEventArgs,这将允许您在必要时取消关闭。此外,您正在使用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 :(得分:1)

我的回答是:

1.不要调用this.close()函数,因为你已经处于结束事件中。

2.如果您想更改结束事件操作(关闭或不关闭),您只需设置 FormClosingEventArgs 参数(以下代码中的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;