2009-08-05 92 views
1

私はWindowsフォームアプリケーションで作業しています。メインウィンドウの "X"ボタンをクリックすると、ユーザーに近い理由を示すメッセージを表示したい。「X」ボタンとは、ウィンドウの「最小化」、「最大化」、「閉じる」トレイの「閉じる」ボタンを意味する。なぜform_closing()が2回実行されていますか?

私はこのコードを書いています。今、何が起こる

private void frmIMS_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (MessageBox.Show("This application is closing down because of " + e.CloseReason.ToString() + ". Do you really want to close it ?", "", MessageBoxButtons.YesNo) == DialogResult.No) 
     {     
      e.Cancel = true; 
     } 
     else 
     { 
      Application.Exit(); 
     } 
    } 

は、ユーザーがメッセージボックスに何をクリックすると、イベントは破棄されていないと、ユーザーがクリックしたときにはい、)(form_closingが再び発射し、それを表示したい他のmessagebox.Soのメッセージボックスがtwice.I示されていることを示します一度。助けて、なぜ二度発射したのかを教えてください。

答えて

2

アプリケーションのelse部分はスキップできます。あなたのフォームがメインフォームのアプリケーションであれば、とにかく終了します。 Application.Exit()はすべてのウィンドウを閉じます。あなたの「最初の」クローズはまだ保留中ですので、フォームはまだクローズされておらず、Application.Exit()は2回目のフォームのクローズを試みます。

あなたはこれを試すことができます。

bool closingPending = false; 
private void frmIMS_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (closingPending) return; 
    if (MessageBox.Show("This application is closing down because of " + e.CloseReason.ToString() + ". Do you really want to close it ?", "", MessageBoxButtons.YesNo) == DialogResult.No) 
    {     
     e.Cancel = true; 
    } 
    else 
    { 
     closingPending = true; 
     Application.Exit(); 
    } 
} 
+0

私はApplication.Exit()を呼び出さない場合、開いたままのスプラッシュフォームを持っているため、Application.Exit()を削除できません。 – Rohit

+0

スプラッシュフォームへの参照はありますか?はいの場合は、Application.Exitの代わりにsplashForm.Close()を呼び出すことができます。 – Przemaas

0

なぜ他の支店でApplication.Exit?これは自動的に行われ、問題を解決する可能性があります。

2

私はこのスレッドが少し古いですが、なぜ知っている:

$Application.OpenForms["NameOfMainForm"].Close; 
0
Private Sub ClaimEditor_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing 
    If MsgBox("Edit mode active. Exit without saving?", MsgBoxStyle.YesNo Or MsgBoxStyle.Question, "Edit mode") <> MsgBoxResult.Yes Then 
     e.Cancel = True 
     Exit Sub 
     'Else 
     ' e.Cancel = False 
    End If 
    WriteIntoRregistry() 
    RemoveHandler Me.FormClosing, AddressOf ClaimEditor_FormClosing 
    Application.Exit() 
End Sub 
+0

OPに問題が発生する理由を説明しませんでした。 – Neolisk

1

私は、これは古いです知っていると私は同じ動作が発生したとして、私はこの質問につまずきました。私は、.NET 4.5を使用して、ここで私はこの問題についていった方法があるよ:

private void frmIMS_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.UserClosing) 
    { 
     if (MessageBox.Show("This application is closing down because of " + e.CloseReason.ToString() + ". Do you really want to close it ?", "", MessageBoxButtons.YesNo) == DialogResult.No) 
     {     
      e.Cancel = true; 
     } 
     else 
     { 
      Application.Exit(); 
     } 
    } 
} 

あなたがここに詳しい情報についてCloseReason列挙見つけることができます:私はこの同じ問題を持っていたアプリケーションと判断http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx

0

を。 Exit()はFormClosingイベントを呼び出していました。 FormClosingイベントではなく、FormClosedイベントでのみApplication.Exit()を配置します。

は、このコードを使用します。

private void frmIMS_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (closingPending) return; 
    if (MessageBox.Show("This application is closing down because of " + 
e.CloseReason.ToString () + ". Do you really want to close it ?", "" 
, MessageBoxButtons.YesNo) == DialogResult.No) 
{     
    e.Cancel = true; 
} 
else 
{ 
    closingPending = true; 
    // Application.Exit(); <-- Remove this 

} 

private void frmIMS_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    Application.Exit(); <-- Put it here. 
} 
0

Tornado726は、すでにすべてのための最善の答えに答え@私は思います。しかし、私はちょうど同じ問題ことを持っていた(2回form_closing入力された)、私は推測するだけで1コピー/貼り付け間違い

Private Sub FORM1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing 

    Select Case (MessageBox.Show("Do you really want to close?", "Quit", MessageBoxButtons.YesNo)) 
     Case MsgBoxResult.No 
      e.Cancel = True 
    End Select 
End Sub 

Private Sub FORM1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed 
    Application.Exit() 
End Sub 
-1

があります。これは私がそれを回避するためにやったことです:

private void frmIMS_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (MessageBox.Show("This application is closing down because of " + e.CloseReason.ToString() + ". Do you really want to close it ?", "", MessageBoxButtons.YesNo) == DialogResult.No) 
     { 
      e.Cancel = true; 
     } 
     else 
     { 
      try 
      { 
       Environment.Exit(0); // It will try to close your program "the hard way" 
      } 
      catch (Exception) 
      { 
       Application.Exit(); // If a Win32 exception occurs, then it will be able to close your program "the normal way" 
      } 
     } 
    } 

それはかなりしばらくしているとして、あなたは既に解決策を見つけたり、そのコードをあきらめていない場合、私は、あなたのために仕事に行くのだと確信しています。

0

はこれを試してみてください。これはfrmX_FormClosing()を呼び出すApplication.Exit()大きな助け

private void Master_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     DialogResult result = MessageBox.Show("Do you really want to exit the program?", "Data Patch", MessageBoxButtons.YesNo); 

     if (result != DialogResult.Yes) 
     { 
      e.Cancel = true; 
     } 
    } 
0

になります。

だからこそ、FormClosing()が2回呼び出されるのです。

関連する問題