原因可能是我的Processbar1
和ReportProgress
分別只觸發一次?Backgroundworker ReportProgress只觸發一次?
我第一次點擊按鈕,一切都按預期工作。除了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();
}
我已經找到了問題..
問題是,我試圖清除的GridView在我運行Backgroundworker之前,這個包含GridView.DataSource = dt;
的點擊事件將一個額外的數據源綁定到網格(我認爲是這樣),而不是清除網格。
private void btnClearGrid_Click(object sender, EventArgs e)
{
dt.Clear();
GridView.DataSource = null;
}
什麼是'價值'int x = xxx.MaxValue;'語句之後的x'你的解釋告訴它是循環計數的總數,但我似乎並不是。 –
從上面的問題描述中,'i ++'只在第一次運行時發生。我們可能需要查看更多代碼。 – Bolu
x =只是文件中行的總數(實際上= 129886),我也將它用作「foreach-loop」的集合。 _可以是任何值。但是我發現progressBar正在工作,第二次運行的時候非常慢,然後我運行'button1_Click-Event'。 – MrMAG