2011-04-20 71 views
0

我玩一些非常简单的窗体形式。我对那个询问是否要保存他们所键入的内容的用户的形式组织接近事件的事件处理程序:为什么我的windows窗体关闭?

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()应触发表单关闭事件,调用我的事件处理程序,由于国旗现在为真,表单应该关闭没有问题。

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

回答

6

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

我怀疑是因为close()正在从调用close事件内有一些内部重挫事情(无论是抑制或Cancel传播过来,等)。只需清理代码(保存到文件与关闭窗口无关,尽管文件可能已保存并且窗口在按钮事件中关闭)。

快乐编码。

+0

因此调用this.Close()难道不引发新的形式关闭事件? – richzilla 2011-04-20 21:06:19

+0

@richzilla我不确定它是哪一个:-)这将很容易调试,以找出究竟发生了什么。在关闭事件的顶部检查“取消”的值(例如警告消息框或调试器断点和监视)。这将说明发生了什么。 – 2011-04-20 21:08:36

1

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

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

退出closeNpForm后,窗体检查事件的Cancel属性,实际上并不会自动关闭。

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

0

除了@pst说了什么之外,如果您不想取消表格的关闭,您为什么要设置Cancel = true

如果您删除e.Cancel = true;this.Close();它应该做你想做的。

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(); 
      } 
     } 
    } 
    }