C# DatagridView单元格绘制工作不正常
我有一个表单可以加载一个C# DatagridView单元格绘制工作不正常,c#,winforms,datagridview,paint,C#,Winforms,Datagridview,Paint,我有一个表单可以加载一个DataGridView。我创建了一个CellPainting事件,根据单元格值为行着色。我做了一个cellpraining,因为在Datagridview中的行上迭代并绘制它们花费了太长的时间,所以这更有效 问题 CellPainting事件不适用于表单加载。这意味着所有的行都是隐藏的,直到我滚动或单击它们,然后根据单元格值正确地绘制它们 我注意到的另一件事是缺少列标题。另一个问题是,当我用滚动条向下滚动DataGridView行时,会再次调用CellPainting
DataGridView
。我创建了一个CellPainting
事件,根据单元格值为行着色。我做了一个cellpraining
,因为在Datagridview
中的行上迭代并绘制它们花费了太长的时间,所以这更有效
问题
事件不适用于表单加载。这意味着所有的行都是隐藏的,直到我滚动或单击它们,然后根据单元格值正确地绘制它们李>CellPainting
- 我注意到的另一件事是缺少列标题。另一个问题是,当我用滚动条向下滚动
行时,会再次调用DataGridView
,在它重新绘制行颜色时,我必须等待几秒钟。这很烦人,尤其是当我有数千行的时候,每次滚动都会导致延迟李>CellPainting
CellPainting
方法时,DatagridView
列标题和行都出现了,所以问题显然就在那里。下面是我的代码片段,非常感谢您的帮助
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;
}
}
}
private void timeLineDataGridView\u CellPainting(对象发送方,DataGridViewCellPaintingEventArgs e)
{
//只有粗体和/或彩色的行是假的
如果((布尔)timeLineDataGridView.Rows[e.RowIndex].Cells[12]。值==false)
{
//获取时间戳,并继续加粗
DateTime eventTime=DateTime.Parse(timeLineDataGridView.Rows[e.RowIndex].Cells[“TIMESTAMP”].Value.ToString());
timeLineDataGridView.Rows[e.RowIndex].DefaultCellStyle.Font=this.boldFont;
if(eventTime
请尝试该事件。当单元格内容需要格式化以供显示时发生
在这种情况下,它应该更合适
编辑
它似乎解决了除滚动问题以外的所有问题
如何使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
),您将感兴趣:
- ,这描述了可能的错误
- ,这是上面帖子中建议的解决方法
CellPainting
handler<如果在滚动期间不更改值,则代码>单元格格式设置事件不应导致此行为。你说“滚动时不要这样做”是什么意思?是的,CellPaint事件已删除。我的意思是,如何使CellFormatting事件在我滚动时不触发,因为它在我滚动时被调用(这是理所当然的)。这会导致它在“重新格式化”时出现延迟。因此,如果datagridview中有1000行,我可以看到50行,每次向下滚动查看更多行时,我必须等待CellFormatting事件处理程序重新格式化单元格,从而导致延迟。这有点像一个缓冲区不好的youtube视频,这是我能描述这种行为的最好方式。好吧,这修复了犹豫,“缓冲”效应,但它还有另一个副作用。上面的代码在您的编辑工作,表单加载,我可以立即滚动DGV没有任何暂停/犹豫,而它的重新格式化。但我注意到的是,只有第一组可见行受到所需行颜色的影响。这意味着,如果我只能看到50行,当我滚动查看其他行时,没有一行使用需要基于条件If块的背景色绘制。基本上,Scroll事件只绘制DGV中第一组可见的行,而不是所有行。同意,我认为这只是性能问题。但感谢你的帮助,值得我们努力去看看是否存在解决方案,我从不同的尝试和我们的讨论中学到了很多。我不知道如何给你分数,让我知道如果有一些其他信用我可以给。我已经编辑了你的标题。请看,这里的共识是“不,他们不应该”。我会记住,在以后的帖子上,谢谢你的指导。