DGV CellPainting表现出乎意料

时间:2013-01-01 18:02:24

标签: c# winforms datagridview

我正在DataGridView中显示一个小时列表,并希望隐藏工作时间之外的那些小时。我试图使用CellPainting做到这一点,但是我得到了奇怪的结果。有人可以解释我在这里做错了吗?

private void dgvItemView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    switch (_formType)
    {
        case FormType.DayView:
            TimeSpan openTime = iFlow.Properties.Settings.Default.BusinessHourOpen;
            TimeSpan closeTime = iFlow.Properties.Settings.Default.BusinessHourClose;

            DataGridViewCell cell = this.dgvItemView[e.ColumnIndex, e.RowIndex];

            if (cell.RowIndex < openTime.Hours || cell.RowIndex > closeTime.Hours)
            {
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(25, Color.Red)), e.ClipBounds);
            }
            break;
    }
}

但是,此代码会产生渐变效果,如下所示:

Form

我真的不明白。当我向上和向下滚动时,阴影也会消失并重新出现,具体取决于我滚动的程度。

那么有人可以解释我在这里做错了什么吗?我还需要绘制部分块,以防工作时间不在工作时间,例如08:45至17:30,所以我不能只改变单元格的BackColor来实现这一点。

1 个答案:

答案 0 :(得分:2)

e.ClipBounds指的是DataGridView的整个可见部分 您实际上在做的是在整个可见DataGridView区域上绘制多个透明图层,在滚动时产生渐变效果。

您应该使用e.CellBounds代替。

与您的问题无关的另一个问题是您正在从SolidBrush泄漏GDI句柄。绘制后Dispose()的{​​{1}},或者更好的是,使用SolidBrush语句:

using

编辑:

您还必须在绘画后将using (var sb = new SolidBrush(Color.FromArgb(25, Color.Red))) { e.Graphics.FillRectangle(sb , e.CellBounds); } 设置为e.Handled,以防止系统对您的作品进行绘画。

来自MSDN

  

如果手动绘制单元格,请设置HandledEventArgs.Handled   财产到真。如果未将HandledEventArgs.Handled设置为true,   单元格将绘制您的自定义设置。