我已经创建了一个DataGridView,其中一个单元格(DataGridViewTextBoxCell)我希望有一个背景图片。为此,我在 CellPainting 事件中使用了以下内容。
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
var image = Resources.item_qty_white;
e.PaintBackground(e.ClipBounds, false);
e.Graphics.DrawImageUnscaled(image, 1410, e.CellBounds.Top);
}
效果很好,图像在我想要的位置上排成一排。但是,它所在的单元格具有带数值的DataGridViewTextBoxCell。图像浮在此值的顶部,因此被隐藏。我想理想的解决方案是使DataGridViewTextBoxCell成为“TopMost”,但我无法弄清楚如何做到这一点。
然后我决定尝试让背景图片部分透明,以便下面的值是可视的,所以我将 CellPainting 代码更改为以下。
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
var image = Resources.item_qty_white;
e.PaintBackground(e.ClipBounds, false);
image.MakeTransparent(Color.White);
e.Graphics.DrawImageUnscaled(image, 1410, e.CellBounds.Top);
}
这再次起作用,我可以看到我想要的背景图像周围的值。但是,当我尝试更新单元格的值时,会出现下一个问题。一旦我这样做,之前的值是可见的,我试图设置的新值与它重叠。我现在卡住了。
非常感谢任何建议/指导。
答案 0 :(得分:2)
您必须设置e.Handled = true
以防止系统绘画。以下代码按预期工作。
void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex != -1 && e.ColumnIndex == columnIndex)
{
if ((e.PaintParts & DataGridViewPaintParts.Background) != DataGridViewPaintParts.None)
{
e.Graphics.DrawImage(Resources.Image1, e.CellBounds);
}
if (!e.Handled)
{
e.Handled = true;
e.PaintContent(e.CellBounds);
}
}
}