2012-09-20 81 views
8

Tengo un problema interesante. Estoy tratando de usar una tabla de datos como fuente de datos para una vista de cuadrícula de datos. Quiero colorear algunas de las celdas de la tabla para indicar varias cosas, pero por alguna razón el color no se mostrará. Entonces, el siguiente código muestra una celda sin color.No se puede cambiar el color de la celda datagridview cuando se usa una fuente de datos

dataGridView1.DataSource = table; 

dataGridView1.Rows[0].Cells[0].Style.BackColor = Color.Yellow; 

I sólo se puede obtener un color para visualizar después de la carga de forma inicial (por ejemplo el establecimiento de un color de la celda en el evento OnClick). Sin embargo, si creo explícitamente las filas y columnas para la vista como en el siguiente código, la coloración funciona.

foreach (DataColumn col in table.Columns) 
    dataGridView1.Columns.Add(col.ColumnName, col.ColumnName); 

for (int i = 0; i < table.Rows.Count; i++) 
{ 
    var row = table.Rows[i]; 
    object[] values = new object[table.Columns.Count]; 
    for (int x = 0; x < table.Columns.Count; x++) 
     values[x] = row[x].ToString(); 

    dataGridView1.Rows.Add(values); 
} 

dataGridView1.Rows[0].Cells[0].Style.BackColor = Color.Yellow; 

No deseo tener el código de esta manera. ¿Alguien sabe lo que está sucediendo aquí que me está impidiendo colorear las células?

+1

No muestra dónde está tratando de colorear las celdas, supongo que está dentro del constructor de formularios, después de llamar a InitializeComponent(). Mi respuesta se basa en eso. –

Respuesta

19

Si intenta establecer el color de la celda dentro del constructor del formulario que estará llegando antes de los datos se ha completado la unión por lo que los cambios en las células no se peguen (no me pregunte por qué, sólo una de esas trampas con el DataGridView

la solución más directa de esto es establecer los colores un poco más tarde - por lo general dentro de un manejador de DataBindingComplete evento:.

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
{ 
    dataGridView1.Rows[0].Cells[0].Style.BackColor = Color.Yellow; 
} 

esto es apropiado para la coloración estática de la gr id: si desea que los colores cambien según los cambios dentro de la cuadrícula, utilice el evento CellFormatting para cambiar las celdas.

+0

¡genial! ¡gracias! me ayudó mucho – Novikoff

+0

Vea también https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/cell-styles-in-the-windows-forms-datagridview-control, consulte la sección ' Establecer estilos dinámicamente'. – Wollmich

5

Esto es algo que he implementado recientemente, no sé si ayudará?

private void dgvOutstandingReports_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
      { 
       int colIndex = e.ColumnIndex; 
       int rowIndex = e.RowIndex; 


       if (rowIndex >= 0 && colIndex >= 0) 
       { 
        DataGridViewRow theRow = dgvOutstandingReports.Rows[rowIndex]; 


        if (theRow.Cells[colIndex].Value.ToString() == "Daily Report") 
        { 
         theRow.DefaultCellStyle.BackColor = Color.LightYellow; 
        } 
        else if (theRow.Cells[colIndex].Value.ToString() == "Monthly Report") 
        { 
         theRow.DefaultCellStyle.BackColor = Color.LightGray; 
        } 
        else if (theRow.Cells[colIndex].Value.ToString() == "SMP Report") 
        { 
         theRow.DefaultCellStyle.BackColor = Color.Snow; 
        } 
        else if (theRow.Cells[colIndex].Value.ToString() == "Weekly Report") 
        { 
         theRow.DefaultCellStyle.BackColor = Color.Pink; 
        } 
        else if (theRow.Cells[colIndex].Value.ToString() == "Hourly Report") 
        { 
         theRow.DefaultCellStyle.BackColor = Color.LightSteelBlue; 
        } 
       } 
      } 
Cuestiones relacionadas