什么原因是 myProcessbar1
和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();
}
我找到了问题..
问题是我在运行 Backgroundworker 之前尝试清除 Gridview 并且这个btnClearGrid
-Click-Event 包含GridView.DataSource = dt;
将一个额外的数据源绑定到网格(我认为是这样),而不是清除网格.
private void btnClearGrid_Click(object sender, EventArgs e)
{
dt.Clear();
GridView.DataSource = null;
}