DatagridView Cell绘图无法正常工作

时间:2013-08-16 20:15:09

标签: c# winforms datagridview paint

我有一个加载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;
                        }
                }
        }

1 个答案:

答案 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),您会对以下内容感兴趣: