在另一个线程中更改DataGridViewRow属性

时间:2008-11-03 20:10:21

标签: c# multithreading datagridview

好的,所以我将DataGridView绑定到后台线程中的BindingSource,而一点点“Please Wait”模型窗口让用户受理。没问题。

但是,我需要根据行的数据绑定项类型更改一些行背景颜色。像这样:

for (int i = 0; i < dgItemMaster.Rows.Count; i++)
{
  if (dgItemMaster.Rows[i].DataBoundItem.GetType().Name == "Package")
  {
   dgItemMaster.Rows[i].DefaultCellStyle.BackColor = Color.PowderBlue;                    
  }
}

以编程方式我可以这样做,但它足够的行,它会在迭代行时锁定GUI。我正在寻找有关处理这种情况的最佳方法的想法。

这就是我现在正在做的事情:

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            dgItemMaster.DataSource = products;
            dgItemMaster.BeginInvoke((Action)(() =>
            {
                for (int i = 0; i < dgItemMaster.Rows.Count; i++)
                {
                    if (dgItemMaster.Rows[i].DataBoundItem.GetType().Name == "Package")
                    {
                        dgItemMaster.Rows[i].DefaultCellStyle.BackColor = Color.PowderBlue;
                    }
                    else if (dgItemMaster.Rows[i].DataBoundItem.GetType().Name == "PackageKit")
                    {
                        dgItemMaster.Rows[i].DefaultCellStyle.BackColor = Color.Pink;
                    }
                }
            }));
        }

2 个答案:

答案 0 :(得分:1)

我会尝试运行在RowAdded事件中更改backcolor的代码,这将在每行添加到Grid时触发,不需要再次遍历整个列表。

http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.rowsadded.aspx

祝你好运。

答案 1 :(得分:1)

这里的数据量是多少?要挂断UI,它必须是非平凡的。一个极端的答案是切换到virtual mode - 但这是很多工作。

如果您只是不想挂起UI,可能只是立即执行第一个 x (20?50?)行,然后分批执行其余操作 - 基本上模拟{{1}只是没有DoEvents的代码气味......

(未测试的)

DoEvents