【发布时间】:2017-05-14 06:38:44
【问题描述】:
我有一个 datagridview,它通过 DataSource 由 DataTable 填充,我正在使用 backgroundworker 格式化单元格(背景颜色和单元格的前景色)在 datagridview 中。
BackgroundWorker bw = new BackgroundWorker();
private void Frm_Find_Load(object sender, EventArgs e)
{
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
CheckForValidValues();
}
public bool CheckForValidValues()
{
dgv.Invoke((MethodInvoker)delegate()
{
for (int i = 0; i < Dt.Rows.Count; i++)
{
if (Dt.Rows[0]["Name"].ToString() == Value)
{
dgv.Rows[i].Cells["Name"].Style.BackColor = Color.FromArgb(255, 192, 192);
}
else
{
dgv.Rows[i].Cells["Name"].Style.BackColor = Color.White;
}
progressBar1.Invoke((MethodInvoker)(() => progressBar1.Value++));
}
});
this.Invoke((MethodInvoker)delegate()
{
BtnShow.Enabled = true;
dgv.Enabled = true;
});
}
private void btnSave_Click(object sender, EventArgs e)
{
if (bw.IsBusy == false)
{
progressBar1.Visible = true;
progressBar1.Value = 0;
BtnShow.Enabled = false;
dgv.Enabled = false;
progressBar1.Maximum = dgv.Rows.Count;
bw.RunWorkerAsync();
}
}
当整个过程停止时,DataGridView 仍然是Enabled=false,因此用户无法更改 datagridview 中的任何值。
datagridview 中通常有 15,000 行并且要格式化的行很多,这需要时间,这就是为什么我使用 backgroundworker 并且它工作非常好但是当用户尝试按下启用 false datagridview 几次,主线程变得无响应并且进度条冻结。
谁能指导我如何处理它?
【问题讨论】:
-
你为什么使用 C# 3.0?升级使用
async/await -
@AluanHaddad 我知道我使用的是 Visual Studio (2008) 的过时版本,但由于某种原因我必须坚持使用它,你能告诉我一个解决方法吗
标签: multithreading winforms datagridview c#-3.0 backgroundworker