2

フォームにボタンがあり、クリックすると次のようになります。

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 を表示するだけです。息子の...

4

1 に答える 1