フォームにボタンがあり、クリックすると次のようになります。
private void btnCheckSVN_Click(object sender, EventArgs e)
{
wait = new DevExpress.Utils.WaitDialogForm("Fetching File SVN Status",
"Please Wait");
wait.AutoSize = true;
wait.Visible = false;
bgwSVN.RunWorkerAsync();
wait.ShowDialog();
}
private void bgwSVN_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = svn.SvnStatusEventArgsToDataTable(svn.CheckSVN(_localPath));
}
private void bgwSVn_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
DataTable dt = (DataTable)e.Result;
dt.DefaultView.Sort = "File ASC";
gdcSVN.DataSource = dt;
gdcSVNDefaultView.BestFitColumns();
xtcTabs.SelectedTabPageIndex = 1;
lblTotalFileCount.Text = dt.Rows.Count.ToString();
if (dt.Rows.Count == 0)
XtraMessageBox.Show("No files found.",
"Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
wait.Close();
}
この操作の順序では、(明らかに) 背後に待機ダイアログが表示MessageBox
されますが、私の意見では、本当にずさんに見えます。
IF ステートメントとClose()
呼び出しを切り替えるとWaitDialogForm
、より適切な用語がないために半分消えてしまいます。赤いフレームと巨大な X が通過する空の長方形があり、MessageBox
その上に独自のフォームがあります。
あらゆる種類のマルチスレッドをいじったり、オブジェクトをまったく使用したりするのはこれが初めてなBackgroundWorker
ので、本当にばかげたものを見逃しているだけだと思いますが、何がわかりませんか?
このイベントから を完全に削除しようとしましたMessageBox
が、代わりに次のようにしました。
wait.Close();
lblTotalFileCount.Text = dt.Rows.Count.ToString();
次に、ラベルの TextChanged イベントを処理し、MessageBox を表示する必要があるかどうかを確認します...しかし、赤いボックスでも同じ結果が得られます。
編集; また、私が気づいた奇妙なこと。フォームの読み込み時に、lblTotalFileCount が 0 に設定されました。このメソッドが実行され、0 個のファイルが見つかったと言うと、lblTotalFileCount.Text がゼロにリセットされます... TextChanged イベントをトリガーしなかったのはどれですか? すでに同じものに設定されていたことは理解していますが、それでも技術的に変更されました。私は何かを見逃していますか、それともイベントは実際にその条件をチェックし、そうであれば「スキップ」しますか? 代わりに、ラベルを空の文字列に設定する必要がありました...しかし、彼らがアプリケーションを実行すると、0に設定され、警告が表示され、いくつかの変更が加えられ、再度実行されます...それでも0、それはしません彼らに警告します。
編集 2 ; メッセージボックスが表示される前に、最初の編集で述べたように、ラベルの TextChanged イベントで wait.Close() を呼び出してみたら、おそらくうまくいくと思いましたか? いいえ。同じ問題。そして、ボタンをもう一度クリックすると、フォームがクラッシュするのは、待機が破棄されたためですか? これはフォーム レベルのプロパティですが、なぜ破棄されるのでしょうか?
編集 3 ; TextChanged イベントで wait.Dispose を呼び出すと、目的の動作が得られます。ただし、メイン アプリケーションを最小化し、背後に何もない場合を除き、MessageBox を表示するだけです。息子の...