好的,所以我将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;
}
}
}));
}
答案 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