我正在玩一些非常简单的窗体。我有一个表单关闭事件的事件处理程序,询问用户是否要保存他们键入的内容:
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
来引用我的表单实例。
答案 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();
}
}
}
}