winforms - toda - Fila de DataGridView: selección semitransparente o borde de fila en la selección
seleccionar ultima fila datagridview vb net (1)
Si desea dibujar un borde alrededor de las filas seleccionadas, puede usar DataGridView.RowPostPaintEvent , y para ''borrar'' los colores de selección, puede usar las propiedades DataGridViewCellStyle.SelectionBackColor y DataGridViewCellStyle.SelectionForeColor .
Por ejemplo, si configuro el estilo de celda de fila como este
row.DefaultCellStyle.BackColor = Color.LightBlue;
row.DefaultCellStyle.SelectionBackColor = Color.LightBlue;
row.DefaultCellStyle.SelectionForeColor = dataGridView1.ForeColor;
Puedo agregar este código al RowPostPaintEvent
private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
if (dataGridView1.Rows[e.RowIndex].Selected)
{
using (Pen pen = new Pen(Color.Red))
{
int penWidth = 2;
pen.Width = penWidth;
int x = e.RowBounds.Left + (penWidth / 2);
int y = e.RowBounds.Top + (penWidth / 2);
int width = e.RowBounds.Width - penWidth;
int height = e.RowBounds.Height - penWidth;
e.Graphics.DrawRectangle(pen, x, y, width, height);
}
}
}
y una fila seleccionada se mostrará así:
Tengo un DataGridView donde el fondo de cada fila es diferente dependiendo del elemento vinculado a los datos. Sin embargo, cuando selecciono una fila, ya no puedo ver su color de fondo original.
Para resolver esto, he pensado en dos soluciones:
Puedo hacer las selecciones semitransparentes, lo que permite ver si dos filas seleccionadas tienen diferentes colores de fondo.
O; Puedo eliminar completamente los colores de selección y dibujar un borde alrededor de las filas seleccionadas.
¿Qué opción es más fácil y cómo puedo hacer esto?
Es una aplicación WinForm.
Editar: terminé usando parte de tu código, a la deriva
private void dgv_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
if (dgv.Rows[e.RowIndex].Selected)
{
var row = dgv.Rows[e.RowIndex];
var bgColor = row.DefaultCellStyle.BackColor;
row.DefaultCellStyle.SelectionBackColor = Color.FromArgb(bgColor.R * 5 / 6, bgColor.G * 5 / 6, bgColor.B * 5 / 6);
}
}
Esto da la impresión de un color de selección semitransparente. ¡Gracias por tu ayuda!