我有一个加载DataGridView
的表单。我创建了一个CellPainting
事件,根据单元格值为行着色。我做了一个CellPainting
,因为迭代回Datagridview
中的行并绘制它们花了太长时间,所以这更有效率。
问题
CellPainting
事件不适用于表单加载。意味着隐藏所有行,直到我滚动或单击它们为止,然后根据单元格值正确绘制它们。 DataGridView
行时,再次调用CellPainting
,并且我必须等待几秒钟,因为它重新绘制了行颜色。这非常烦人,尤其是当我有数千行时,每次滚动时滚动都会导致延迟。 所有这些问题都消失了,当我删除DatagridView
方法时,CellPainting
列标题和行都会显示,所以显然存在问题。以下是我的片段,感谢您的帮助。
private void timeLineDataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
//only bold and/or color the rows that are false
if ((Boolean)timeLineDataGridView.Rows[e.RowIndex].Cells[12].Value == false)
{
//get timestamp and go ahead and bold it
DateTime eventTime = DateTime.Parse(timeLineDataGridView.Rows[e.RowIndex].Cells["TIMESTAMP"].Value.ToString());
timeLineDataGridView.Rows[e.RowIndex].DefaultCellStyle.Font = this.boldFont;
if (eventTime < this.delay_warn_time3)
{
timeLineDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
}
else if (eventTime < this.delay_warn_time2)
{
timeLineDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Orange;
}
else if (eventTime < this.delay_warn_time1)
{
timeLineDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Yellow;
}
}
}
答案 0 :(得分:1)
尝试DataGridView.CellFormatting事件。 当需要格式化单元格的内容以进行显示时发生。
在这种情况下应该更合适。
修改强>
它似乎解决了除滚动问题之外的所有问题。
滚动
时如何让CellFormatting事件无法触发
您可以在类中添加一个标志(一个布尔变量),在DataGridView.CellFormatting
方法中使用它来测试网格是否正在滚动,然后DataGridView.Scroll
事件来标记此标志。
bool _IsScrolling = false;
void DataGridView1_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
{
if (e.Type == ScrollEventType.EndScroll)
{
_IsScrolling = false;
} else
{
_IsScrolling = true;
}
}
这是理论的答案。如果您尝试但不起作用(e.Type
永远不会ScrollEventType.EndScroll
),您会对以下内容感兴趣: