5

重複の可能性:
Winforms プログレス バーが更新されない (C#)

こちらで初めて質問させていただきます。

このコード スニペットを使用して問題を説明します。

progressBar1.Maximum = 50;
for (int i = 0; i < 50; i++)
{
    progressBar1.Value++;
}
MessageBox.Show("Finished");
progressBar1.Value = 0;

このコードの問題は、プログレスバーの描画が終了したときではなく、for ループが終了したときに MessageBox がポップアップすることです。プログレスバーの描画が完了するまで待ってから続行する方法はありますか?

みんなありがとう!

4

3 に答える 3

4

をご覧になることをお勧めしますSystem.Windows.Forms.Application.DoEvents()参照

progressBar1.Maximum = 50;
for (int i = 0; i < 50; i++)
{
    progressBar1.Value++;
    Application.DoEvents();
}
MessageBox.Show("Finished");
progressBar1.Value = 0;
于 2011-08-23T11:49:17.667 に答える
2

ここでの問題は、UI スレッドですべての作業を行っていることです。UI を再描画するには、通常、Windows メッセージをポンピングする必要があります。これを修正する最も簡単な方法は、進行状況バーを更新するように指示することです。Control.Updateを呼び出すと、保留中の描画が強制的に同期的に完了されます。

progressBar1.Maximum = 50;
for (int i = 0; i < 50; i++) 
{
     progressBar1.Value++; 
     progressBar1.Update();
} 
MessageBox.Show("Finished"); 
progressBar1.Value = 0; 

機能する可能性のある他の方法は、バックグラウンド スレッドを使用することです (UI スレッドに同期するために必要な追加の Control.Invoke 呼び出しをすべて使用します)。DoEvents (前述のとおり) も機能するはずです。DoEvents を使用すると、ペイント メッセージを通過できる時間の間、ウィンドウでメッセージを再度処理できます。ただし、メッセージ キュー内のすべてのメッセージを送り出すため、望ましくない副作用が生じる可能性があります。

于 2011-08-23T13:03:32.433 に答える
1

次のコードを試してください

progressBar1.Maximum = 50;
for (int i = 0; i < 50; i++)
{
   this.SuspendLayout();
   progressBar1.Value++;
   this.ResumeLayout();
}
MessageBox.Show("Finished");

progressBar1.Value = 0;
于 2011-08-23T11:50:48.803 に答える