2015-12-25 75 views
1

對於一個學校項目,我被要求創建一個Web瀏覽器。 在上下文菜單中,我有一個「退出」按鈕,它執行一些東西,如將數據上傳到SQL數據庫等。如果「try」塊中有錯誤,則catch塊會向用戶提供一個問題,如果他想要關閉或不關閉。從另一個事件中取消FormClosing事件?

在「formclosing」事件中,我已經將「已退出」功能與「退出」按鈕連接起來,因此如果用戶按下窗口屏幕上的紅色「X」來關閉窗體,會有同樣的效果。

問題是因爲它是一個「formclosing」事件,即使用戶在「退出」按鈕的問題對話框中選擇了「否」,它也會關閉表單。

所以我的問題是如何從我的「退出」按鈕中取消「formclosing」請求?

P.S. 請忽略諸如delete sql命令之類的奇怪事情,我們的老師有一些奇怪的請求。假設這確實是所請求的功能。

private void יציאהToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    Favorite fav; 
    SqlCommand delfav = new SqlCommand("DELETE FROM tblFavorites", conn); 
    SqlCommand addfav = new SqlCommand("INSERT INTO tblFavorites VALUES (@title, @url)", conn); 
    addfav.Parameters.Add("@title", SqlDbType.NVarChar, 100); 
    addfav.Parameters.Add("@url", SqlDbType.NVarChar, 300); 
    try 
    { 
     conn.Open(); 
     delfav.ExecuteNonQuery(); 
     for (int i=0; i<favorites.Items.Count; i++) 
     { 
      fav = (Favorite)favorites.Items[i]; 
      addfav.Parameters["@title"].Value = fav.getsettitle; 
      addfav.Parameters["@url"].Value = fav.getseturl; 
      addfav.ExecuteNonQuery(); 
     } 
     Application.Exit(); 
    } 
    catch 
    { 
     DialogResult dialogResult = MessageBox.Show("There was a problem loading your favorites to the database. Do you still wish to quit? \n (All changes to the favorites list will be lost)", "", MessageBoxButtons.YesNo); 
     if (dialogResult == DialogResult.Yes) 
     { 
      Application.Exit(); 
     } 
     else 
     { 
      //Cancel the formclosing event here! 
     } 
    } 
    finally 
    { 
     conn.Close(); 
    } 
} 

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    יציאהToolStripMenuItem_Click(null, null); 
} 
+0

將清理代碼移到另一個方法中。 –

+0

這就是我討厭winforms的原因! @HansPassant – dotctor

回答

1

您應該替換這兩個事件處理程序的功能。您也應該使用this.Close()而不是Application.Exit()

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

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    // your code 
    try 
    { 
     // your code 
    } 
    catch 
    { 
     DialogResult dialogResult = MessageBox.Show("There was a problem loading your favorites to the database. Do you still wish to quit? \n (All changes to the favorites list will be lost)", "", MessageBoxButtons.YesNo); 
     if (dialogResult != DialogResult.Yes) 
     { 
      //Cancel the formclosing event here! 
      e.Cancel = true; 
     } 
    } 
    finally 
    { 
     conn.Close(); 
    } 
} 
+1

真是太棒了! 我甚至沒有考慮過這麼簡單的解決方案,因爲使用This.Close()函數會激活關閉窗體! 非常感謝! –

+1

只需稍微修改一下你的答案 - 不需要「this.Close();」函數在「try」塊中,因爲它已經在「formclosing」事件中,並且在那裏會產生一個雙關閉,它將跳過它到「catch」塊。 即「try」塊中的所有命令都會成功,但無論如何它都會移動到catch塊。 –