c# - según - como hacer que una celda de excel cambie de color automaticamente
c#cambia el color de una fila si no está vacía (4)
Tengo una tabla y algunos valores. Si el "Nombre" de la celda de fila no está vacío, cambie el color del fondo a violeta.
Name ID Customers
Niky 1 yes // here change background to violet
2 no
Donna 3 yes // here change background to violet
Baka 4 no // here change background to violet
5 yes
6 no
He intentado este código pero no funciona, no sé por qué:
foreach (DataGridViewRow row1 in dataGridView1.Rows)
{
if (row1.Cells[0].Value != null)
{
row1.DefaultCellStyle.BackColor = Color.Violet;
}
}
El lugar habitual para poner este tipo si el código está dentro del controlador de eventos DataBindingComplete
, adjunte el evento como se indica a continuación o use el diseñador:
dataGridView1.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(dataGridView1_DataBindingComplete);
Luego en el controlador tienes algo como esto:
void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
foreach (DataGridViewRow row1 in dataGridView1.Rows)
{
if (row1.Cells.Cast<DataGridViewCell>().Any(c => c.Value == null || string.IsNullOrWhiteSpace(c.Value.ToString())))
{
row1.DefaultCellStyle.BackColor = Color.Violet;
}
else
{
row1.DefaultCellStyle.BackColor = Color.White;
}
}
}
En el código anterior he cambiado el código original para que ahora mire todas las celdas en lugar de solo la primera.
También puede poner el código en el evento CellFormatting.
No sé dónde colocaste tu código de color, pero siempre lo hice en la sección de dibujo
He aquí donde coloreé la línea en función de un estado, a excepción de la primera columna, que dependía de amarillo o azul: este es el código de trabajo en progreso y debe ordenarse
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex >= 0 && e.ColumnIndex > 0)
{
if (dataGridView1.Rows[e.RowIndex].Cells[].Value.ToString() == "good")
{
e.CellStyle.BackColor = Color.PaleGreen;
e.CellStyle.SelectionForeColor = Color.Black;
e.CellStyle.SelectionBackColor = Color.Wheat;
}
if (dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString() == "warning")
{
e.CellStyle.BackColor = Color.LightGoldenrodYellow;
e.CellStyle.SelectionForeColor = Color.Black;
e.CellStyle.SelectionBackColor = Color.Wheat;
}
if (dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString() == "error")
{
e.CellStyle.BackColor = Color.Salmon;
e.CellStyle.SelectionForeColor = Color.Black;
e.CellStyle.SelectionBackColor = Color.Wheat;
}
if (e.Value.ToString() == "Yellow")
{
e.CellStyle.BackColor = Color.Yellow;
}
else
if (e.Value.ToString() == "Blue")
{
e.CellStyle.BackColor = Color.LightBlue;
}
}
}
O puedes hacer:
foreach(DataGridViewRow r in dataGridView1.Rows)
{
if(!String.IsNullOrEmpty(r.Cells[0].Value.ToString()))
{
r.DefaultCellStyle.BackColor = Color.Violet;
}
}
entonces, si toda la primera celda de una línea no está vacía, colorea la fila violeta.
Una buena (pero no efectiva) forma de lograr esto es el cell-formatting
de cell-formatting
evento de la vista de cuadrícula de datos. Puede leer toda la documentación en MSDN . La esencia es que te suscribas al evento de formato y en esto puedes hacer tus problemas de formato.
De esta manera, puede estar seguro de que los colores, etc., están bien, sin importar si el usuario está cambiando de tamaño, desplazando lo que sea.
Por cierto: no lo haría en el evento de dibujo, ya que aprendí que generalmente romperás algo de la lógica de dibujo automatizada;)
Para obtener más información, hay un artículo sobre estilos de celda en MSDN que en este caso será excesivo. Pero nunca se sabe lo suficiente :)
puedes hacerlo en el evento rowdatabound de gridview
También puede usar este uso, puede ir a través de él:
foreach(DataGridViewRow r in dataGridView1.Rows)
{
if(r.Cells.Cast<DataGridViewCell>().Any(c => c.Value.ToString() == string.Empty))
{
r.DefaultCellStyle.BackColor = Color.Violet;
}
}