我正在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;
}
}
但是,此代码会产生渐变效果,如下所示:
我真的不明白。当我向上和向下滚动时,阴影也会消失并重新出现,具体取决于我滚动的程度。
那么有人可以解释我在这里做错了什么吗?我还需要绘制部分块,以防工作时间不在工作时间,例如08:45至17:30,所以我不能只改变单元格的BackColor来实现这一点。
答案 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, 单元格将绘制您的自定义设置。