我想在检索数据时逐步更新我的gridview
我有一个背景工作者如下工作功能
private void backGroundWrkr_DoWork(object sender, DoWorkEventArgs e)
{
DataTable dtInstant = new DataTable();
for (int i = 0; i < allFiles.Count; i++)
{
if (backGroundWrkr.CancellationPending)
{
e.Cancel = true;
return;
}
myApp.processFile(allFiles[i]);
this.Invoke((MethodInvoker)delegate
{
myGrdVw.DataSource = myApp.dtResults;
});
backGroundWrkr.ReportProgress(100 * (i + 1) / allFiles.Count);
}
backGroundWrkr.ReportProgress(100);
}
这是我的报告进度功能
private void backGroundWrkr_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
}
这是我的backGroundWrkr完成
private void backGroundWrkr_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar.Visible = false;
allFiles.Clear();
}
我也尝试过BeginInvoke而不是Invoke,我的gridview仍然会冻结! 我处理文件的逻辑没有问题,因为如果我在workercomplete中放入datagridview绑定它会成功绑定
答案 0 :(得分:1)
经过2天的搜索和不成功的试验,我已经解决了如下问题 虽然绑定它似乎backgroundworker在数据表中工作,所以我绑定结果数据表的副本,它解决了我的问题
private void backGroundWrkr_DoWork(object sender, DoWorkEventArgs e)
{
DataTable dtInstant = new DataTable();
for (int i = 0; i < allFiles.Count; i++)
{
if (backGroundWrkr.CancellationPending)
{
e.Cancel = true;
return;
}
myApp.processFile(allFiles[i]);
this.Invoke((MethodInvoker)delegate
{
myGrdVw.DataSource = myApp.dtResults.copy();
});
backGroundWrkr.ReportProgress(100 * (i + 1) / allFiles.Count);
}
backGroundWrkr.ReportProgress(100);
}
感谢大家的帮助!
答案 1 :(得分:0)
尝试仅绑定数据源一次(即在调用DoWork之前)并在backGroundWrkr_ProgressChanged中执行myGrdVw.Invalidate()。