Pregunta

Estoy usando C #, Windows Forms, y .Net 3.5

Mi forma tiene una DataGridView personalizado (doble buffer para evitar el parpadeo durante mis eventos cellformatting, como se ve aquí ). Al realizar una búsqueda en la base de datos, Ato el conjunto de datos resultante a la datagridview.

Me controlar el evento CellFormatting filas para pintar de un color determinado, dependiendo de sus datos.

Mi código DataGridView:

resultsGridView.DataSource = results.DefaultViewManager.DataSet.Tables[0];
resultsGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue;
resultsGridView.BorderStyle = BorderStyle.Fixed3D;
resultsGridView.CellFormatting += new DataGridViewCellFormattingEventHandler(resultsGridView_CellFormatting);

Mi código CellFormatting:

void resultsGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    int rowIndex = e.RowIndex;
    DataGridViewRow therow = resultsGridView.Rows[rowIndex];
    if ((bool)therow.Cells["Sealed"].Value == true)
    {
        therow.DefaultCellStyle.BackColor = Color.Pink;
    }
    if (therow.Cells["Database"].Value as string == "PNG")
    {
        therow.DefaultCellStyle.BackColor = Color.LightGreen;
    }
}

Todo funciona muy bien excepto que, cuando manejo el CellFormatting, evento Paint de toda la forma parece ser desactivado. El cursor deja de parpadear en el cuadro de texto, y menustrip del formulario se ve así:

imagen barra de Menú

La parte superior está delante de una búsqueda, el fondo después. La barra de menú no se volverá a dibujar hasta que el ratón sobre el lugar donde los menuitems son, y luego el último elemento a destacar permanecerá así cuando muevo el ratón fuera de la barra de menú. Al mover la forma parece hacer que se vuelva a pintar, pero sigue siendo el problema.

Al comentar la línea resultsGridView.CellFormatting en el código DataGridView fija por completo el problema.

¿Estoy pintando las células mal, o hay algo más que tenga que manejar?

¿Fue útil?

Solución

Usted probablemente está causando una excepción dentro de este evento. No estoy seguro de cómo se define el manejo, pero que rodea el código con un intento de captura sería un primer paso.

try 
{
   int rowIndex = e.RowIndex;
   ....   
}
catch(Exception ex)
{
    System.Diagnostics.Trace.Error(ex.message);
}

En un segundo aspecto, no creo therow.Cells["Sealed"] va a funcionar. Pruebe algo como therow.Cells["dataGridViewTextBoxColumn2"]. Las células se indexa por Nombre de columna , no DataPropertyName .

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