2011-04-20 143 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(); 
      } 
     } 
    } 
    }