如何保存数据时关闭事件发生在WinForms

本文关键字:事件 WinForms 何保存 保存 数据 | 更新日期: 2023-09-27 18:13:44

我想要一个消息框询问未保存的数据在窗体关闭事件。

如果用户选择是,则将数据保存在文本文件中并退出应用程序。

如果用户选择不保存不退出应用程序。

我试过下面的代码。但是它不关闭应用程序,并使消息框一次又一次地出现。

  public void SaveMyFile()
    {
        //// Create a SaveFileDialog to request a path and file name to save to.
        SaveFileDialog saveFile1 = new SaveFileDialog();
        //// Initialize the SaveFileDialog to specify the RTF extension for the file.
        saveFile1.DefaultExt = "*.txt";
        saveFile1.Filter = "Info Changed Data (*.txt)|*.txt";
        //// Determine if the user selected a file name from the saveFileDialog. 
        if (saveFile1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
           saveFile1.FileName.Length > 0)
        {
            //// Save the contents of the RichTextBox into the file.
            richTextBox1.SaveFile(saveFile1.FileName, RichTextBoxStreamType.PlainText);
        }
    }
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        DialogResult dialogResult = MessageBox.Show("Do You Want To Save Your Data", "CodeJuggler", MessageBoxButtons.YesNo);
        if (dialogResult == DialogResult.Yes)
        {
            SaveMyFile();
            this.Close();
        }
        else if (dialogResult == DialogResult.No)
        {
            this.Close(); 
        }
    }

如何保存数据时关闭事件发生在WinForms

删除行

this.Close();

这是不必要的。应该是这样的:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    DialogResult dialogResult = MessageBox.Show("Do You Want To Save Your Data", "CodeJuggler", MessageBoxButtons.YesNo);
    if (dialogResult == DialogResult.Yes)
    {
        SaveMyFile();
    }
}

或者像这样:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        DialogResult dialogResult = MessageBox.Show("Do You Want To Save Your Data", "CodeJuggler", MessageBoxButtons.YesNoCancel);
        if (dialogResult == DialogResult.Yes) SaveMyFile();
        else if (dialogResult == DialogResult.Cancel) e.Cancel = true;
    }

"…"没有循环的"一次又一次"通常暗示程序中有一些隐退。

在您的情况下,您在Closing事件处理程序中调用Form.Close(),然后引发Closing事件,其中您调用Form.Close()和…我想你明白了。

简单地删除对Close()的调用,您不需要它们。如果Closing被提升,那么您的表单将被关闭,除非您将FormClosingEventArgs参数中的Cancel属性设置为true