web-dev-qa-db-ja.com

フォームが閉じられたことを検出するc#

ボタン付きのプロンプトを表示するWinFormを作成しました。メッセージボックスダイアログでは不十分だったため、これはカスタムWinFormビューです。

バックグラウンドワーカーを起動して実行しています。また、while(aBackgroundWorker.IsBusy)myFormのボタンがクリックされた場合にループします。

//MyProgram.cs

using(CustomForm myForm = new CustomForm())
{
    myForm.Show(theFormOwner);
    myForm.Refresh();

    while(aBackgroundWorker.IsBusy)
    {
        Thread.Sleep(1);
        Application.DoEvents();
    }
}

現在、CustomFormButton_clickedイベント、私は持っています

//CustomForm.cs

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

クロージャを検出できるようにするには、CustomFormクラス、またはフォームを宣言して初期化する場所にさらにコードを追加する必要がありますか?

13
jkh

フォームが実際に閉じられたことを検出するには、FormClosedイベントをフックする必要があります。

    this.FormClosed += new FormClosedEventHandler(Form1_FormClosed);

    void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        // Do something
    }

または:

using(CustomForm myForm = new CustomForm())
{
    myForm.FormClosed += new FormClosedEventHandler(MyForm_FormClosed);
    ...
}

void MyForm_FormClosed(object sender, FormClosedEventArgs e)
{
    // Do something
}
25
competent_tech

あなたはやり過ぎになるかもしれません。ダイアログウィンドウのようなフォームを表示し、フォームが終了するのを待ってから、呼び出し側のフォームに制御を戻すには、次のコマンドを使用します。

mySubForm.ShowDialog();

これにより、子が閉じられるまでメインフォームが「ブロック」されます。

5
Dracorat

フォームを閉じるときに通知されるように、フォームの FormClosing イベントを処理して、クリーンアップを実行できるようにします。

0
Kekoa

FormClosingイベントとFormClosedイベントにフックできるはずです。

http://msdn.Microsoft.com/en-us/library/system.windows.forms.form.formclosing.aspx http://msdn.Microsoft.com/en-us/library/ system.windows.forms.form.formclosed.aspx

クローズはそれがクローズされる前です。 Closedは、閉じられた後です。

0
user1231231412

いくつかのこと...

まず、ダイアログが開いている間に実行フォームが進行しないようにするために、ループがあるようです。その場合は、.Show(parent).ShowDialog(parent)に変更してください。これで、残りの質問も処理されます。

0
Sam Axe

バックグラウンドワーカーがキャンセルをサポートしていることを確認します。他のユーザーが指摘したように、フォームクローズイベントハンドラーを使用します。このコードは正しい方向を示しているはずです。

using(CustomForm myForm = new CustomForm())
{
  myForm.FormClosed += new FormClosedEventHandler(ChildFormClosed);
  myForm.Show(theFormOwner);
  myForm.Refresh();


  while(aBackgroundWorker.IsBusy)
  {
    Thread.Sleep(1);
    Application.DoEvents();
  }
}

void ChildFormClosed(object sender, FormClosedEventArgs e)
{
    aBackgroundWorker.CancelAsync();
}
0
evasilchenko

this.Hide();は、closedイベントをオーバーライドする実際のダイアログのthis.Close();と同じではないことに注意してください。

0
dcarl661