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

C# 用于关闭Windows窗体应用程序的事件处理程序,c#,winforms,forms,validation,savechanges,C#,Winforms,Forms,Validation,Savechanges,我试图创建一个事件处理程序,当用户选择CloseX按钮时,它会提示用户保存任何未保存的更改。这是我的C代码: 我创建了事件处理程序MainFram\u FormClosing,当用户选择close x按钮时触发它 private void MainFrame_FormClosing(object sender, FormClosingEventArgs e) { // Close the Spreadsheet. CloseFileOperation(); } 每当我选择关闭按

我试图创建一个事件处理程序,当用户选择CloseX按钮时,它会提示用户保存任何未保存的更改。这是我的C代码:

我创建了事件处理程序MainFram\u FormClosing,当用户选择close x按钮时触发它

private void MainFrame_FormClosing(object sender, FormClosingEventArgs e)
{
    // Close the Spreadsheet.
    CloseFileOperation();
}
每当我选择关闭按钮时,应用程序就会崩溃。。我已经读了这封邮件的回复。我想我违反了法律。我想我不明白为什么这个功能不能这么容易实现


最好的方法是什么?

如果您使用事件处理程序本身而不是单独的例程,您可以访问FormClosingEventArgs,这将允许您在必要时取消关闭。你也在使用这个。关闭;,它只是重新启动事件,而不是返回并让事件完成。当我使用此代码集作为事件处理程序时,它会按预期在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;
            }
        }
    }

如果使用事件处理程序本身而不是单独的例程,则可以访问FormClosingEventArgs,这将允许您在必要时取消关闭。你也在使用这个。关闭;,它只是重新启动事件,而不是返回并让事件完成。当我使用此代码集作为事件处理程序时,它会按预期在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.不要调用此.close函数,因为您已经处于关闭事件中

2.如果要更改关闭事件actionclose或Not close,只需将下面代码属性cancel中的FormClosingEventArgs参数e设置为true以取消关闭,或设置为false以关闭

3.如果未保存工作表,则无需执行任何操作,在这种情况下,应在不提示的情况下关闭表单。因此,可以忽略else块

这里修改的代码是:

如果电子表格。已更改

            {
                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;
我的答案是:

1.不要调用此.close函数,因为您已经处于关闭事件中

2.如果要更改关闭事件actionclose或Not close,只需将下面代码属性cancel中的FormClosingEventArgs参数e设置为true以取消关闭,或设置为false以关闭

3.如果未保存工作表,则无需执行任何操作,在这种情况下,应在不提示的情况下关闭表单。因此,可以忽略else块

这里修改的代码是:

如果电子表格。已更改

            {
                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;

在你的MainFram_FormClosing事件上放一个断点并检查。如果这么简单,它就不会在堆栈上。当事件被触发时,它似乎会持续执行CloseFileOperation。在MainFram_FormClosing事件上放置一个断点并进行检查。如果它这么简单,它就不会在堆栈上。触发事件时,它似乎会持续执行CloseFileOperation。