在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);
}
}
代码有效,当我点击其中一行来选择它时,字体变为粗体,但有一个重叠。
文字重复,似乎常规字体中的原始文字保留在背景上,粗体上的新文字显示在顶部稍微向右移位。
为什么会这样?为什么会发生这种重叠,我该如何解决呢?
答案 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();
这就是结果
首先你需要一个混色器,如果我们使用原始背景色,这将创建透明效果
//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);
}
}