2010-12-15 43 views
11

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.Fila de DataGridView: selección semitransparente o borde de fila en la selección

Para solucionar esto, he pensado en dos soluciones:

que puede hacer las selecciones semitransparente, por lo que es posible 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 algunos de su 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!

Respuesta

7

Si desea dibujar un borde alrededor de las filas seleccionadas, se puede utilizar el DataGridView.RowPostPaintEvent, y para los colores claros de selección '', puede utilizar los DataGridViewCellStyle.SelectionBackColor y DataGridViewCellStyle.SelectionForeColor propiedades.

Por ejemplo, si fijo el estilo de celda fila como esta

row.DefaultCellStyle.BackColor = Color.LightBlue; 
row.DefaultCellStyle.SelectionBackColor = Color.LightBlue; 
row.DefaultCellStyle.SelectionForeColor = dataGridView1.ForeColor; 

puedo añadir este código a la 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 seleccionado se mostrará la siguiente manera:

row with border

+0

He probado esto, y estaba bien. Luego apareció un nuevo problema: el color de la selección transparente parecía realmente feo (el texto estaba sobre el texto antiguo y otras cosas difíciles de explicar;) después de una clasificación, así que buscaré otra solución. –

+0

Usé su código para crear un color de selección semitransparente en su lugar - vea editar. ¡Gracias por tu ayuda! –

Cuestiones relacionadas