与背景图象的Datagridview细胞

时间:2014-03-21 13:27:00

标签: c# winforms datagridview

我已经创建了一个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);
    }

这再次起作用,我可以看到我想要的背景图像周围的值。但是,当我尝试更新单元格的值时,会出现下一个问题。一旦我这样做,之前的值是可见的,我试图设置的新值与它重叠。我现在卡住了。

非常感谢任何建议/指导。

1 个答案:

答案 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);
        }            
    }
}