Pregunta

Tengo un DataGridView unido a una lista de objetos, y estoy establecer un color de fondo de células dinámico utilizando el evento CellFormatting, como en esta respuesta . Esto funciona bien para todas las columnas excepto la DataGridViewCheckboxColumn. Cuando pulso en el interior de esta célula (pero fuera de la casilla de verificación) los cambios de fondo de celda al blanco por defecto.

Visualmente parece que se está produciendo la selección de células, a pesar de mis mejores esfuerzos para detenerlo. Mi celda de formato de código establece el SelectionBackColor así como la BackColor. Tengo la selección de células con discapacidad mediante el evento CellStateChanged, y ninguna de las otras columnas son seleccionables:

private void PlayerGrid_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
{
    if (e.StateChanged == DataGridViewElementStates.Selected)
       e.Cell.Selected = false;
}

¿Existe una solución alternativa adicional para reemplazar el comportamiento celular para casillas de verificación?

¿Fue útil?

Solución

He encontrado una solución añadiendo el siguiente código al evento CellStateChanged:

if (e.Cell is DataGridViewCheckBoxCell)
      e.Cell.Style.BackColor = BackgroundColor(e.Cell.RowIndex);

(BackgroundColor() calcula el color de fondo de la celda en base a la fila.)

Esta cura el problema, pero podría causar problemas de rendimiento para las tablas más grandes o virtuales, provocando la creación de objetos de estilo adicionales.

Otros consejos

me gusta más este enfoque para lo que estoy haciendo. Es capaz de agnóstico cambia color de fondo (incluyendo casilla de verificación) de cualquiera de las células DataGridView con un clic del ratón o el tabulador - por ejemplo los fines - para resaltar la celda seleccionada en ese momento. He encontrado otros enfoques curiosamente no colorear el fondo de la casilla de verificación que se coloreaban otros tipos de células. En mi ejemplo, yo estoy usando este enfoque en caso CellFormatting pero creo que una sintaxis similar puede duplicarse en otro lugar con éxito. Además, creo que esto responde a la pregunta más estrechamente PO lo que se refiere a, en concreto, el evento CellFormatting.

void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
 {


if (W.mf.dgv.CurrentCell != null && e.RowIndex==W.mf.dgv.CurrentCell.RowIndex & e.ColumnIndex==W.mf.dgv.CurrentCell.ColumnIndex)
         {

                 W.mf.dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = Color.YellowGreen;

         }
         else
         {
                 W.mf.dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = W.mf.dgv.DefaultCellStyle.SelectionBackColor;

         }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top