Hola, en el tutorial anterior personalizamos un DataGridView, ahora aplicaremos formato condicional a una Columna-Celdas para mostrar los productos en bajo stock en color rojo de Alerta, mostrar una marca de un color determinado, también es muy usado para mostrar notas académicas, entre otras. El Formato Condicional se usa muy a menudo en las hojas de cálculo de Excel.
Bien, empecemos con tutorial:
PD: Este es un tutorial actualizado del Video tutorial de YouTube.
Mostrar de Color Rojo los Productos en Bajo Stock (Celda-Columna)
Cambiaremos el color de fondo y el color del texto de las celdas en la columna Stock u cualquier columna con valores numéricos del Datagridview, para este ejercicio usaré el proyecto CRUD con Arquitectura en Capas y POO Nivel Base.
1. Crear evento CellFormatting
En la pestaña de eventos de las propiedades del DataGridView, buscamos el evento CellFormatting, sobre ello, haga Doble Clic para crear el evento. Este evento nos permite dar formato al contenido a las Celdas-Columnas. El método del evento de debió haber quedado de esta manera:
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { }
2. Codificar
- Creamos una condición para obtener el índice de la columna del Datagridview, el nombre de la columna debe ser igual como está escrita en la base de datos, o igual al nombre de la columna que asignó manualmente al crear las columnas, o también puede ser igual al número de posición: if (this.dataGridView1.Columns[e.ColumnIndex].Name == «Stock»)
- Creamos otra condición para no aplicar el formato a valores nulos del DGV, esto para evitar errores (como sucedió en el video tutorial): if (e.Value != null)
- También creamos otra condición para no aplicar el formato a valores nulos devueltos desde la base de datos, de igual manera para evitar errores: if (e.Value.GetType() != typeof(System.DBNull))
- Por último, aplicamos el formato que deseemos a cualquier columna, en este caso la columna stock, puedes cambiar el formato a cuan Datos/Condiciones desees. Por ejemplo, yo aplicare formato condicional para pintar de naranja a stock de productos menores a 20 (if (Convert.ToInt32(e.Value) <= 20)), y pintar de rojo a stock de productos menores a 10 (if (Convert.ToInt32(e.Value) <= 10)). Y así sucesivamente puedes agregar formato a cualquier valor.
El código completo te debería quedar de estar manera:
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (this.dataGridView1.Columns[e.ColumnIndex].Name == "Stock") { if (e.Value != null) { if (e.Value.GetType() != typeof(System.DBNull)) { //Stock menor a 20 if (Convert.ToInt32(e.Value) <= 20) { e.CellStyle.BackColor = Color.LightSalmon; e.CellStyle.ForeColor = Color.Red; } //Stock menor a 10 if (Convert.ToInt32(e.Value) <= 10) { e.CellStyle.BackColor = Color.Salmon; e.CellStyle.ForeColor = Color.Red; } } } } }
Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting If Me.DataGridView1.Columns(e.ColumnIndex).Name = "Stock" Then If e.Value IsNot Nothing Then If e.Value.[GetType]() <> GetType(System.DBNull) Then 'Stock menor a 20' If Convert.ToInt32(e.Value) <= 20 Then e.CellStyle.BackColor = Color.LightSalmon e.CellStyle.ForeColor = Color.Red End If 'Stock menor a 10' If Convert.ToInt32(e.Value) <= 10 Then e.CellStyle.BackColor = Color.Salmon e.CellStyle.ForeColor = Color.Red End If End If End If End If End Sub
Mostrar de Color una marca determinada (Celda-Columna)
De igual manera que lo anterior, podemos aplicar formato condicional a valores en cadena (Texto), en esta ocasión cambiaré de color del texto de la celada en la columna Marca u cualquier columna con valores en cadena del Datagridview.
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (this.dataGridView1.Columns[e.ColumnIndex].Name == "Marca") { if (e.Value != null) { if (e.Value.GetType() != typeof(System.DBNull)) { if (e.Value.ToString() =="iberica") { e.CellStyle.ForeColor = Color.SeaGreen; } if (e.Value.ToString() == "marcacola") { e.CellStyle.ForeColor = Color.SteelBlue; } } } } }
Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting If Me.DataGridView1.Columns(e.ColumnIndex).Name = "Marca" Then If e.Value IsNot Nothing Then If e.Value.[GetType]() <> GetType(System.DBNull) Then If e.Value.ToString() = "iberica" Then e.CellStyle.ForeColor = Color.SeaGreen End If If e.Value.ToString() = "marcacola" Then e.CellStyle.ForeColor = Color.SteelBlue End If End If End If End If End Sub
Aplicar formato condicional a varias columnas
Puedes aplicar formato condicional a varias columnas en el mismo método del evento CellFormatting, por ejemplo, formato a la columna stock y marcas de los ejemplo anteriores:
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (this.dataGridView1.Columns[e.ColumnIndex].Name == "Stock") { if (e.Value != null) { if (e.Value.GetType() != typeof(System.DBNull)) { //Stock menor a 20 if (Convert.ToInt32(e.Value) <= 20) { e.CellStyle.BackColor = Color.LightSalmon; e.CellStyle.ForeColor = Color.Red; } //Stock menor a 10 if (Convert.ToInt32(e.Value) <= 10) { e.CellStyle.BackColor = Color.Salmon; e.CellStyle.ForeColor = Color.Red; } } } } if (this.dataGridView1.Columns[e.ColumnIndex].Name == "Marca") { if (e.Value != null) { if (e.Value.GetType() != typeof(System.DBNull)) { if (e.Value.ToString() =="iberica") { e.CellStyle.ForeColor = Color.SeaGreen; } if (e.Value.ToString() == "marcacola") { e.CellStyle.ForeColor = Color.SteelBlue; } } } } }
Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting If Me.DataGridView1.Columns(e.ColumnIndex).Name = "Stock" Then If e.Value IsNot Nothing Then If e.Value.[GetType]() <> GetType(System.DBNull) Then 'Stock menor a 20 If Convert.ToInt32(e.Value) <= 20 Then e.CellStyle.BackColor = Color.LightSalmon e.CellStyle.ForeColor = Color.Red End If 'Stock menor a 10 If Convert.ToInt32(e.Value) <= 10 Then e.CellStyle.BackColor = Color.Salmon e.CellStyle.ForeColor = Color.Red End If End If End If End If If Me.DataGridView1.Columns(e.ColumnIndex).Name = "Marca" Then If e.Value IsNot Nothing Then If e.Value.[GetType]() <> GetType(System.DBNull) Then If e.Value.ToString() = "iberica" Then e.CellStyle.ForeColor = Color.SeaGreen End If If e.Value.ToString() = "marcacola" Then e.CellStyle.ForeColor = Color.SteelBlue End If End If End If End If End Sub