Domanda

Ho provato a impostare il colore di sfondo di una vista a griglia di dati per essere "trasparente" dalle proprietà, ma diceva "non una proprietà valida".

Come posso farlo?

È stato utile?

Soluzione

Ho fatto questa soluzione a un problema specifico (quando la griglia era contenuta in una forma con immagine di sfondo) con modifiche Simples puoi adattarla per creare una griglia trasparente generica, basta chiedere se il genitore ha un'immagine di sfondo, altrimenti usa semplicemente il backcolor genitore Per dipingere la tua griglia, e questo è tutto.

È necessario ereditare da DataGridView e sovrascrivere il metodo PaintBackground come questo:

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

Altri suggerimenti

L'ho fatto con la soluzione di Deumber e funziona, ma provoca alcuni problemi che ho evitato aggiungendo piccoli miglioramenti:

A. scorrere il DGV incasina lo sfondo. Soluzione: mettilo da qualche parte:

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

Lo sfondo continuerà a scorrere, ma verrà corretto immediatamente dopo ogni passaggio di scorrimento. È evidente, ma era accettabile per me. Qualcuno sa una soluzione migliore per supportare lo scorrimento di questo?

B. Il designer ha problemi a usarlo. soluzione:

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

Ora il designer lo tratta proprio come un DGV. fallirà se vuoi disegnare il DGV mentre non hai una forma attiva, ma di solito non è così. È anche possibile mantenere la linea if mentre potresti comunque voler utilizzare il designer ed eliminarlo per il rilascio.

Non è possibile avere un colore trasparente nella proprietà di sfondo DataGridView.

Così ho deciso di sincronizzare questa proprietà con il backcolor del genitore. La buona vecchia funzionalità di databinding di Winforms è molto buona in questo:

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

Subito dopo InitializeComponents();

So che è piuttosto vecchio, ma funziona molto bene.

Imposta il backcolor di DataGridView lo stesso con il colore del modulo. Per fare ciò, seleziona DataGridView: vai su Propries -> RowTemplate -> DefaultCellStyle -> BackColor e scegli il colore del modulo.

È necessario impostare tutte le righe e le colonne su trasparenti. Il modo più semplice è:

for (int y = 0; y < gridName.Rows[x].Cells.Count; y++)
{
     yourGridName.Rows[x].Cells[y].Style.BackColor =
     System.Drawing.Color.Transparent;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top