2010-05-10 96 views
7

這必須是一個愚蠢的問題,但我無法弄清楚。我也無法使用這個設計器,因爲之前的編碼器設法將GUI和邏輯全部集成在一起,所以現在它很混亂。我必須這樣做舊的方式。.NET Windows窗體 - 攔截Close X事件

我有一個可以用3種方式關閉的窗體:關閉按鈕,文件/關閉菜單和X圖標。我希望他們都做同樣的事情。攔截按鈕和菜單事件很容易。實際上,兩者都被連接到了一個onCloseConfig方法。順便說一句,這個方法有更好的名字嗎?

private void onCloseConfig(object sender, System.EventArgs e) 
{ 
    if (! m_configControl.Modified) 
    { 
     Application.Exit(); // Or should it be this.Close(); 
    } 
    .... 
    // Else present a dialog, ask if they want to save. 
} 

因此,攔截X我想:this.FormClosing +=new FormClosingEventHandler(this.onCloseConfig);我認爲這是什麼原因導致一個無限循環。我不想那個:) FormClosed是另一種選擇,但它似乎爲時已晚。我只想攔截X被點擊的事實,而不是表單正在關閉的事實。

回答

12

我認爲您確實希望表單關閉,您可能會忽略的是檢查關閉的原因,並且只有在用戶從用戶那裏取消時纔會取消。

private void my_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.UserClosing) 
    { 
    e.Cancel = true; //I'm sorry Dave, I'm afraid I can't do that. 
    } 
} 

隱藏的「X」設置Form.ControlBox = false,但是這將擺脫最小/最大的爲好。

+0

Cool!有沒有辦法將X完全隱藏起來? – 2010-05-10 15:45:23

+0

不是沒有滾動你自己的窗口鉻。 – Nate 2010-05-10 16:02:18

+1

你可以擺脫最小值最大值並關閉 – 2010-05-10 16:06:35

0

這應該從關閉停止窗口: 的FormClosing(對象發件人,System.EventArts E) { 如果(e.CloseReason == CloseReason.UserClosing) e.Cancel = TRUE; }

+1

System.EventArts [原文如此]或EventArgs沒有CloseReason成員,您需要FormClosingEventArgs,如我的回答 – 2010-05-10 15:34:42

1

順便說一句,有沒有這個 方法更好的名字?

關閉[FormName]可能是更好的選擇。

或者應該是this.Close();

是的,如果你想要的只是關閉窗體。

您應該爲FormClosing事件創建一個新的事件處理程序。它採用FormClosingEventArgs而不是EventArgs作爲參數。在按鈕和菜單項的點擊處理程序中,只需執行this.Close()即可。

這將調用該事件,您可以將所有支票放在那裏。

3

爲按鈕/菜單中選擇創建一個單獨的方法密切:

private void myButton_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

private void myMenuButton_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

private void myForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (m_configControl.Modified) 
    { 
     var result = MessageBox.Show("Name Of Application", "Would you like to save before closing?", MessageBoxButtons.YesNoCancel); 
     if(result == DialogResult.Yes) 
      //Save here 
     else if(result == DialogResult.Cancel) 
      e.Cancel = true; 
    } 
} 

或者,也可以完全通過設置this.ControlBox = false

+0

+1用於創建單獨的方法並分解答案。 =) – 2010-05-10 16:04:32

1

FormClosed event禁用關閉按鈕(「X」)發生一次的形式關閉了。這絕對不是你想要的。

FormClosing event更可能是你需要的。

FormClosing事件觸發任何按鈕或菜單鏈接被點擊。任何試圖關閉表單的事件都會觸發FormClosing事件。

現在,使用FormClosingEventArgs的更合適的方式將是你的FormClosing事件處理方法中的以下內容:

if(m_configControl.Modified) 
    e.Cancel = true; 

所以除非配置控制被修改,表單將關閉。只有在存在更改或未保存的更改時,纔想阻止它關閉。

EDIT 2重讀你的問題後,請參閱我下面的更改上代碼:

if(m_configControl.Modified) 
    if(DialogResult.OK == MessageBox.Show("Do you want to save changes?", "Changes detected") 
     SaveChanges(); 

這則提示未保存的更改用戶和保存只有當用戶在MessageBox點擊OK。請注意,您必須在MessageBox.Show()方法的附加參數中相應地添加按鈕。

如果你想完成的是/否/取消後的FormClosing,那麼你將不得不走這條路:

if(m_configControl.Modified) { 
    DialogResult dr = MessageBox.Show(...); 
    switch(dr) { 
     case DialogResult.OK: 
      SaveChanges(); 
      break; 
     case DialogResult.No: 
      // Do nothing... 
      break; 
     case DialogResult.Cancel: 
      e.Cancel = true; 
    } 
} 

所以,當用戶點擊是的,你的應用程序將保存更改。當他點擊「否」時,應用程序將不會執行任何操作,並將繼續關閉。當用戶希望回到應用程序時,關閉將被阻止。

編輯1注意我對This Question的回答,這看起來相當你想要完成的。