Pergunta

Tentei definir a cor de fundo de uma visualização de grade de dados como "transparente" das propriedades, mas ela diz "não é uma propriedade válida".

Como eu posso fazer isso?

Foi útil?

Solução

Eu fiz essa solução para um problema específico (quando a grade estava contida em um formulário com imagem de fundo) com modificações de simples, você pode adaptá -lo para criar uma grade transparente genérica, basta perguntar se o pai tem imagem de fundo, caso contrário, basta usar o painel de backcolor pai Para pintar sua grade, e isso é tudo.

Você deve herdar do DataGridView e substituir o método do Paintbackground como este:

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;
    }
}

Outras dicas

Fiz isso com a solução de Deumber e funciona, mas causa alguns problemas que evitei adicionar pequenas melhorias:

A. Rolando o DGV atrapalha o plano de fundo. Solução: Coloque isso em algum lugar:

public partial class main : Form
{ 
    protected override CreateParams CreateParams 
    {
    get
        {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;
        return cp;
        }
    }
}

O plano de fundo ainda rolará, mas será corrigido imediatamente após cada etapa de rolagem. É perceptível, mas foi aceitável para mim. Alguém conhece uma solução melhor para apoiar a rolagem com isso?

B. O designer tem problemas usando -o. solução:

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();
    }
}

Agora o designer o trata como um DGV. Ele falhará se você quiser desenhar o DGV enquanto não tiver o ActiveForm, mas esse não é o caso. Também é possível manter a linha IF enquanto você ainda pode usar o designer e excluí-lo para a versão.

Não é possível ter uma cor transparente na propriedade DataGridView BackgroundColor.

Por isso, decidi sincronizar essa propriedade com o backcolor do pai. O bom e velho recurso de banco de dados do WinForms é muito bom nisso:

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

Logo após InitializeComponents();

Eu sei que isso é bem velho, mas isso funciona muito bem.

Defina o mesmo backcolor do DatagridView com a cor do formulário. Para fazer isso, selecione DataGridView: Vá para Propriedades -> RowTemplate -> DefaultCellStyle -> BackColor e escolha a cor do seu formulário.

Você precisa definir todas as linhas e colunas como transparentes. Caminho mais fácil é:

for (int y = 0; y < gridName.Rows[x].Cells.Count; y++)
{
     yourGridName.Rows[x].Cells[y].Style.BackColor =
     System.Drawing.Color.Transparent;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top