为什么我的窗户不关闭?

时间:2011-04-20 20:59:01

标签: c# winforms

我正在玩一些非常简单的窗体。我有一个表单关闭事件的事件处理程序,询问用户是否要保存他们键入的内容:

private void closeNpForm(object sender, FormClosingEventArgs e)
        {
            if (!saveFlag)
            {
                if (MessageBox.Show("Do you want to save the text entered?", "Save Changes?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    e.Cancel = true;
                    saveFlag = true;
                    writeToFile(this.allText.Text);
                }
            }
        }

如果用户单击是(表示他们确实要保存他们的文本),我调用writeToFile方法,并设置一个标志,以便不要求他们再次保存:

private void writeToFile(string text)
        {
            writer = new StreamWriter("inputdata.txt");
            writer.Write(text);
            writer.Close();
            this.Close();
        }

据我所知,writeToFile方法应该在完成时关闭表单。但这并没有发生,当我运行writeToFile方法时,表单才会保持打开状态。谁能告诉我我做错了什么?

据我了解,调用this.Close()应该触发一个表单关闭事件,调用我的事件处理程序,由于该标志现在为true,表单应该关闭而没有问题。

请注意,我的父类扩展了Form类,所以我只是使用this来引用我的表单实例。

4 个答案:

答案 0 :(得分:6)

e.Cancel = true - 哎呀。该事件被告知取消(读:不关闭窗口)。

我怀疑是因为在关闭事件中从调用close()并且正在进行一些内部破坏(被抑制或Cancel传播,等等)。只需清理代码(保存到文件与关闭窗口无关,尽管可能会保存文件并在按钮事件中关闭窗口。)

快乐的编码。

答案 1 :(得分:1)

写入文件并关闭表单是两种不同的操作。你不应该在writeToFile方法中使用this.Close()。

正如pst所说,通过将e.cancel设置为true,您基本上是在告诉CloseForm事件被取消,因此它一旦从closeNpForm事件处理程序退出就不会关闭。

退出closeNpForm后,表单将检查事件的Cancel属性,并且实际上不会继续自行关闭。

为什么要取消close事件然后调用关闭表单的writeToFile?

答案 2 :(得分:0)

除了@pst所说的,如果你不想取消表格的结束,你为什么要设置Cancel = true

如果您删除e.Cancel = true;this.Close();,则应该执行您想要的操作。

答案 3 :(得分:0)

这对我有用:

 public class Form1 : Form
 {
    bool saveFlag;

    private void Form1_Load(object sender, EventArgs ev)
    { FormClosing += closeNpForm;
    }


    private void closeNpForm(object sender, FormClosingEventArgs e)
    {
        if (!saveFlag)
        {
            if (MessageBox.Show("Do you want to save the text entered?", "Save Changes?", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                e.Cancel = true;
                saveFlag = true;
                this.Close();
            }
        }
     }
  }