我有一个
DataGridView
,其中填充了大约 30,000 行。只有两列。
用户只能编辑每行的第一列单元格。当他们完成编辑此单元格时,具有匹配的第一列单元格值的所有其他行都必须更新为新单元格,并且样式必须仅应用于该单元格。
我在 CellValueChanged 事件中这样做:
private void SamplesTable_CellValueChanged(object sender, DataGridViewCellEventArgs e)private void SamplesTable_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
foreach (DataGridViewRow row in SensorsTable.Rows)
{
// only change cells whose value matched the old cell's value that caused this event
if (!row.Cells[0].Value.ToString().Trim().Equals(_oldValue, StringComparison.OrdinalIgnoreCase))
{
continue;
}
row.Cells[0].Value = newValue;
row.Cells[0].Style = cellStyle; // cellStyle is just DataGridViewCellStyle() { BackColor = Color.Yellow };
}
}
当影响数千行时,这大约需要 10 分钟。我尝试在循环之前暂停布局,然后在循环之后恢复布局,但没有注意到差异。
需要注意的一件事是我手动添加列表中的所有行,不涉及绑定。
您需要先更改数据,然后触发一次图形更改,而不是更改要影响的每个单元格的样式。
因此,在
SamplesTable_CellValueChanged
中,请确保覆盖 DataSource
的 SensorsTable
(请参阅此处的示例:https://www.codeproject.com/Questions/192278/Changing-the-datasource-in-a -DataGridView-after-ce)。