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
),您将感兴趣:

  • ,这描述了可能的错误

  • ,这是上面帖子中建议的解决方法


很有趣。它解决了标题问题,也解决了行隐藏问题。唯一剩下的就是滚动时的重新绘制/格式化。当我向上或向下滚动时,仍然会显著延迟。有没有办法说“滚动时不要这样做”@scryptKiddy您是否删除了
CellPainting
handler<如果在滚动期间不更改值,则代码>单元格格式设置
事件不应导致此行为。你说“滚动时不要这样做”是什么意思?是的,CellPaint事件已删除。我的意思是,如何使CellFormatting事件在我滚动时不触发,因为它在我滚动时被调用(这是理所当然的)。这会导致它在“重新格式化”时出现延迟。因此,如果datagridview中有1000行,我可以看到50行,每次向下滚动查看更多行时,我必须等待CellFormatting事件处理程序重新格式化单元格,从而导致延迟。这有点像一个缓冲区不好的youtube视频,这是我能描述这种行为的最好方式。好吧,这修复了犹豫,“缓冲”效应,但它还有另一个副作用。上面的代码在您的编辑工作,表单加载,我可以立即滚动DGV没有任何暂停/犹豫,而它的重新格式化。但我注意到的是,只有第一组可见行受到所需行颜色的影响。这意味着,如果我只能看到50行,当我滚动查看其他行时,没有一行使用需要基于条件If块的背景色绘制。基本上,Scroll事件只绘制DGV中第一组可见的行,而不是所有行。同意,我认为这只是性能问题。但感谢你的帮助,值得我们努力去看看是否存在解决方案,我从不同的尝试和我们的讨论中学到了很多。我不知道如何给你分数,让我知道如果有一些其他信用我可以给。我已经编辑了你的标题。请看,这里的共识是“不,他们不应该”。我会记住,在以后的帖子上,谢谢你的指导。