Установить прозрачность фона сетки данных - PullRequest
5 голосов
/ 25 августа 2009

Я попытался установить цвет фона представления сетки данных, чтобы он был "прозрачным" от свойств, но он сказал "не допустимое свойство".

Как я могу это сделать?

Ответы [ 5 ]

7 голосов
/ 17 марта 2010

Я сделал это решение для конкретной проблемы (когда сетка содержалась в форме с фоновым изображением) с простыми изменениями, вы можете адаптировать ее для создания общей прозрачной сетки, просто спросите, есть ли у родительского фоновое изображение, иначе просто используйте родительский задний цвет для рисования вашей сетки, и это все.

Вы должны наследовать от DataGridView и переопределить метод PaintBackground следующим образом:

protected override void PaintBackground(Graphics graphics, Rectangle clipBounds,  Rectangle gridBounds)
  {
    base.PaintBackground(graphics, clipBounds, gridBounds);
    Rectangle rectSource = new Rectangle(this.Location.X, this.Location.Y, this.Width, this.Height);
    Rectangle rectDest = new Rectangle(0, 0, 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();
  }


public void SetCellsTransparent()
{
    this.EnableHeadersVisualStyles = false;
    this.ColumnHeadersDefaultCellStyle.BackColor = Color.Transparent;
    this.RowHeadersDefaultCellStyle.BackColor = Color.Transparent;


    foreach (DataGridViewColumn col in this.Columns)
    {
        col.DefaultCellStyle.BackColor = Color.Transparent;
        col.DefaultCellStyle.SelectionBackColor = Color.Transparent;
    }
}
2 голосов
/ 24 ноября 2015

Я сделал это с помощью решения Димбера, и оно работает, но вызывает некоторые проблемы, которых я избежал, добавив небольшие улучшения:

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, пока вы все еще хотите использовать конструктор, и удалить ее для выпуска.

0 голосов
/ 03 апреля 2017

Наличие прозрачного цвета в свойстве DataGridView BackGroundColor невозможно.

Поэтому я решил синхронизировать это свойство с родительским BackColor. Хорошая старая функция привязки данных в WinForms очень хороша в этом:

myDataGridView.DataBindings.Add(nameof(DataGrid.BackgroundColor), 
                                this, 
                                nameof(Control.BackColor));

Сразу после InitializeComponents();

Я знаю, что это довольно старо, но это работает очень хорошо.

0 голосов
/ 07 мая 2015

Установить задний цвет datagridview с цветом формы. Чтобы сделать это, выберите вид сетки: перейдите в Свойства -> RowTemplate -> DefaultCellStyle -> BackColor и выберите цвет вашей формы.

0 голосов
/ 25 августа 2009

Вам нужно установить все строки и столбцы прозрачными. Более простой способ:

for (int y = 0; y < gridName.Rows[x].Cells.Count; y++)
{
     yourGridName.Rows[x].Cells[y].Style.BackColor =
     System.Drawing.Color.Transparent;
}
...