Я сделал это с помощью решения Димбера, и оно работает, но вызывает некоторые проблемы, которых я избежал, добавив небольшие улучшения:
A. прокрутка DGV портит фон. решение: поместите это куда-нибудь:
public partial class main : Form
{
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
}
фон все еще будет прокручиваться, но будет исправляться сразу после каждого шага прокрутки. это заметно, но было приемлемо для меня. Кто-нибудь знает лучшее решение для поддержки прокрутки с этим?
B. у дизайнера есть проблемы с его использованием. Решение:
protected override void PaintBackground(Graphics graphics, Rectangle clipBounds, Rectangle gridBounds)
{
base.PaintBackground(graphics, clipBounds, gridBounds);
if (main.ActiveForm != null && this.Parent.BackgroundImage != null)
{
Rectangle rectSource = new Rectangle(this.Location.X, this.Location.Y, this.Width, this.Height);
Rectangle rectDest = new Rectangle(-3, 3, rectSource.Width, rectSource.Height);
Bitmap b = new Bitmap(Parent.ClientRectangle.Width, Parent.ClientRectangle.Height);
Graphics.FromImage(b).DrawImage(this.Parent.BackgroundImage, Parent.ClientRectangle);
graphics.DrawImage(b, rectDest, rectSource, GraphicsUnit.Pixel);
SetCellsTransparent();
}
}
теперь дизайнер воспринимает это как DGV. он потерпит неудачу, если вы когда-нибудь захотите нарисовать DGV, когда у вас нет ActiveForm, но обычно это не так. также можно просто сохранить строку if, пока вы все еще хотите использовать конструктор, и удалить ее для выпуска.