Question

J'ai essayé de définir la couleur d'arrière-plan d'une vue de grille de données pour être "transparente" à partir des propriétés, mais elle disait "pas une propriété valide".

Comment puis-je le faire?

Était-ce utile?

La solution

J'ai fait cette solution à un problème spécifique (lorsque la grille était contenue dans une forme avec image d'arrière-plan) avec des modifications simples, vous pouvez l'adapter pour créer une grille transparente générique, demandez simplement si le parent a une image d'arrière-plan, sinon utilisez simplement le parent backcolor pour peindre votre grille, et c'est tout.

Vous devez hériter de DataGridView et remplacer la méthode Paintbackground comme celle-ci:

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

Autres conseils

Je l'ai fait avec la solution de Deumber et cela fonctionne, mais provoque des problèmes que j'ai évité en ajoutant de petites améliorations:

A. Le défilement du DGV gâche le fond. Solution: mettez ceci quelque part:

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

L'arrière-plan fera toujours défiler, mais sera corrigé immédiatement après chaque étape de défilement. C'est perceptible, mais était acceptable pour moi. Est-ce que quelqu'un connaît une meilleure solution pour soutenir le défilement avec cela?

B. Le concepteur a des problèmes à l'utiliser. la solution:

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

Maintenant, le concepteur le traite comme un DGV. Cela échouera si vous souhaitez dessiner le DGV pendant que vous n'avez pas de forme active, mais ce n'est pas le cas généralement. Il est également possible de garder la ligne IF pendant que vous voudrez peut-être toujours utiliser le concepteur et de le supprimer pour la version.

Avoir une couleur transparente dans la propriété DataGridView BackgroundColor n'est pas possible.

J'ai donc décidé de synchroniser cette propriété avec la backcolor du parent. La bonne ancienne fonctionnalité de données de WinForms est très bonne dans ce domaine:

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

Juste après InitializeComponents();

Je sais que c'est assez vieux, mais cela fonctionne très bien.

Définissez la même chose de DataGridView avec la couleur du formulaire. Pour ce faire, sélectionnez DataGridView: Accédez à Propriétés -> RowTemplate -> DefaultCellStyle -> BackColor et choisissez la couleur de votre formulaire.

Vous devez définir toutes les lignes et colonnes sur transparente. Le moyen plus facile est:

for (int y = 0; y < gridName.Rows[x].Cells.Count; y++)
{
     yourGridName.Rows[x].Cells[y].Style.BackColor =
     System.Drawing.Color.Transparent;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top