DataGridView Cell的透明SelectionBackColor

时间:2016-07-12 19:58:13

标签: c# .net winforms datagridview

在Windows窗体DataGridView中,我尝试使所选行具有粗体字而不更改背景颜色。

就此而言,我使用了以下代码:

// This method is used to load the data into the grid
private void GridLoad()
{
    // Configures the Data Source

    Grid.DefaultCellStyle.SelectionBackColor = Color.Transparent;

    Grid.ClearSelection();          
}

private void Grid_SelectionChanged(object sender, EventArgs e)
{
    var dataGridView = Grid;

    foreach (DataGridViewRow row in dataGrid.Rows)
    {
        row.DefaultCellStyle.Font = dataGrid.Font;
    }

    if (dataGridView.SelectedRows.Count > 0)
    {
        var selectedRow = dataGridView.SelectedRows[0];
        selectedRow.DefaultCellStyle.Font = new Font(dataGridView.Font, FontStyle.Bold);
    }            
}

代码有效,当我点击其中一行来选择它时,字体变为粗体,但有一个重叠。

文字重复,似乎常规字体中的原始文字保留在背景上,粗体上的新文字显示在顶部稍微向右移位。

为什么会这样?为什么会发生这种重叠,我该如何解决呢?

2 个答案:

答案 0 :(得分:2)

主要问题在于这一行:

dataGridView1.DefaultCellStyle.SelectionBackColor = Color.Transparent;

删除它然后你就没有渲染问题了。

不要将SelectionBackColor设置为Color.Transparent,如果您想拥有一个如果您不希望为细胞提供透明的选择背景颜色,那么足以将SelectionBackColor设置为与单元格的BackColor相同的值。

出于此类目的的更合适的事件是CellFormatting事件DataGridView。使用此事件,您可以为单元格提供动态格式:

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.ColumnIndex >= 0 && e.RowIndex >= 0 &&
        this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected)
    {
        e.CellStyle.Font = new Font(e.CellStyle.Font, FontStyle.Bold);
        e.CellStyle.SelectionForeColor = e.CellStyle.ForeColor;
        e.CellStyle.SelectionBackColor = e.CellStyle.BackColor;
    }
    else
    {
        e.CellStyle.Font = new Font(e.CellStyle.Font, FontStyle.Regular);
    }
}

答案 1 :(得分:0)

由于我也在寻找不覆盖原始颜色并且找不到任何好的答案,因此我为此做了一个扩展以创建半透明外观。 如果背景颜色发生变化并且也适用于选择单个单元格,它会保持最新状态

你可以像这样使用这个扩展

dataGridView1.EnableSemiTransparentSelection();

这就是结果

Mixing the original backcolor with a selection color makes it look transparent

首先你需要一个混色器,如果我们使用原始背景色,这将创建透明效果

    //Mix two colors
    //Example: Steps=10 & Position=4 makes Color2 mix 40% into Color1
    public static Color MixColor(Color Color1, Color Color2, int Steps, int Position)
    {
        if (Position <= 0 || Steps <= 1) { return Color1; }
        if (Position >= Steps) { return Color2; }
        return Color.FromArgb(
            Color1.R + ((Color2.R - Color1.R) / Steps * Position),
            Color1.G + ((Color2.G - Color1.G) / Steps * Position),
            Color1.B + ((Color2.B - Color1.B) / Steps * Position)
            );
    }

二、制作扩展

    //Mix SelectionBackColor
    public static void EnableSemiTransparentSelection(this DataGridView dataGridView)
    {
        dataGridView.RowPrePaint += new DataGridViewRowPrePaintEventHandler(GridSemiTransparentSelection_RowPrePaint);
    }
    private static void GridSemiTransparentSelection_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
    {
        DataGridView dataGridView = sender as DataGridView;
        foreach (DataGridViewCell cell in dataGridView.Rows[e.RowIndex].Cells)
        {
            if (cell.Selected == false) { continue; }
            var bgColorCell = Color.White;
            if (cell.Style.BackColor != Color.Empty) { bgColorCell = cell.Style.BackColor; }
            else if (cell.InheritedStyle.BackColor != Color.Empty) { bgColorCell = cell.InheritedStyle.BackColor; }
            cell.Style.SelectionBackColor = MixColor(bgColorCell, Color.FromArgb(0,150,255), 10, 4);
        }
    }