原因可能是我的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