将数据网格视图背景设置为透明

Posted

技术标签:

【中文标题】将数据网格视图背景设置为透明【英文标题】:Set datagrid view background to transparent 【发布时间】:2010-11-22 17:55:30 【问题描述】:

我尝试将数据网格视图的背景颜色设置为对属性“透明”,但它显示“不是有效属性”。

我该怎么做?

【问题讨论】:

这是设计师的错误吗? 【参考方案1】:

我为特定问题(当网格包含在具有背景图像的表单中)做了这个解决方案,您可以对其进行简单修改以创建通用透明网格,只需询问父级是否有背景图像,否则只需使用绘制网格的父背景色,仅此而已。

您必须从 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;
    

【讨论】:

SetCellsTransparent 下,只需使用this.DefaultCellStyle 设置.BackColor 和(可选-但我不会).SelectionBackColor。不需要foreach 循环。【参考方案2】:

我使用 Deumber 的解决方案做到了这一点,它可以工作,但会导致一些麻烦,我通过添加一些小的改进来避免:

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。如果您想在没有 ActiveForm 的情况下绘制 DGV,它将失败,但通常情况并非如此。也可以在您仍想使用设计器时保留 if 行,然后将其删除以进行发布。

【讨论】:

我唯一的改变是删除Rectangle rectDest 中引入的-3, 3 偏移量。对我来说,它使图像的裁剪部分明显不对齐。 -3, 3 可能是由于我的应用程序中的一些细节。我不记得为什么了,但出于某种原因,我需要它来将图像放在我想要的位置。如果它不适合您,请使用这些数字 =)【参考方案3】:

不能在 DataGridView BackGroundColor 属性中使用透明颜色。

所以我决定将此属性与父级的 BackColor 同步。 WinForms 良好的旧数据绑定功能非常擅长:

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

就在InitializeComponents();之后

我知道这已经很老了,但是效果很好。

【讨论】:

【参考方案4】:

您需要将所有行和列设置为透明。更简单的方法是:

for (int y = 0; y < gridName.Rows[x].Cells.Count; y++)

     yourGridName.Rows[x].Cells[y].Style.BackColor =
     System.Drawing.Color.Transparent;

【讨论】:

这在设计期间应该是可能的。【参考方案5】:

设置 datagridview 的背景颜色与表单的颜色相同。为此,请选择 datagridview:转到 Properties -> RowTemplate -> DefaultCellStyle -> BackColor 并选择表单的颜色。

【讨论】:

以上是关于将数据网格视图背景设置为透明的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将行添加到带有背景色的网格[重复]

Android - 网格视图或列表视图?

ad封装背景网格怎么调出来

刷新数据网格视图

使用Umbraco 7.2网格视图,如何将网格视图插入模板?

在“绑定”数据网格视图中设置工具提示