Processbar1
myとReportProgress
each が一度しかトリガー されない理由は何でしょうか?
ボタンを初めてクリックすると、すべてが期待どおりに機能します。それ以降のすべてのクリックProgressBar1
!を除いて、すべてがまだ機能しています。
最初の実行で期待される値を取得するデバッガーで確認できます。progressBar1.Value
それ以降のすべての実行にはprogressBar1.Value
常に「0」が含まれます。
foreach-loop
を実行するのは最も奇妙ですb.ReportProgress(i * 100 / x)
。
i= 現在のループ数
x= 総ループ数
.
ここに私のコードのスニペットがあります:
BackgroundWorker b = new BackgroundWorker();
public Form()
{
InitializeComponent();
b.WorkerReportsProgress = true;
b.DoWork += new DoWorkEventHandler(b_DoWork);
b.RunWorkerCompleted += new RunWorkerCompletedEventHandler(b_RunWorkerCompleted);
b.ProgressChanged += new ProgressChangedEventHandler(b_ProgressChanged);
}
void b_DoWork(object sender, DoWorkEventArgs e)
{
int i = 0;
int x = xxx.MaxValue;
foreach (var item in collection)
{
//... somecode ...(item);
b.ReportProgress(i * 100 / x);
i++;
}
//... somecode
e.Result = dt;
}
void b_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
void b_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
GridView.DataSource = e.Result;
GridView.Update();
}
private void button1_Click(object sender, EventArgs e)
{
b.RunWorkerAsync();
}
編集:
private void btnClearGrid_Click(object sender, EventArgs e)
{
dt.Clear();
GridView.DataSource = dt;
GridView.Update();
}
私は問題を発見しました..
問題は、グリッドをクリアする代わりに、Backgroundworker を実行する前に Gridview をクリアしようとしたことと、追加のデータソースをグリッドにバインドするこのbtnClearGrid
-Click-Event を含む(そう思う) GridView.DataSource = dt;
.
private void btnClearGrid_Click(object sender, EventArgs e)
{
dt.Clear();
GridView.DataSource = null;
}