ボタン付きのプロンプトを表示する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();
}
}
現在、CustomForm
でButton_clicked
イベント、私は持っています
//CustomForm.cs
private void theButton_Click(object sender, EventArgs e)
{
this.Close();
}
クロージャを検出できるようにするには、CustomFormクラス、またはフォームを宣言して初期化する場所にさらにコードを追加する必要がありますか?
フォームが実際に閉じられたことを検出するには、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
}
あなたはやり過ぎになるかもしれません。ダイアログウィンドウのようなフォームを表示し、フォームが終了するのを待ってから、呼び出し側のフォームに制御を戻すには、次のコマンドを使用します。
mySubForm.ShowDialog();
これにより、子が閉じられるまでメインフォームが「ブロック」されます。
フォームを閉じるときに通知されるように、フォームの FormClosing イベントを処理して、クリーンアップを実行できるようにします。
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は、閉じられた後です。
いくつかのこと...
まず、ダイアログが開いている間に実行フォームが進行しないようにするために、ループがあるようです。その場合は、.Show(parent)
を.ShowDialog(parent)
に変更してください。これで、残りの質問も処理されます。
バックグラウンドワーカーがキャンセルをサポートしていることを確認します。他のユーザーが指摘したように、フォームクローズイベントハンドラーを使用します。このコードは正しい方向を示しているはずです。
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();
}
this.Hide();
は、closedイベントをオーバーライドする実際のダイアログのthis.Close();
と同じではないことに注意してください。