with form example ejemplos data c# winforms datagridview

c# - form - Cambio del color de la celda de datagridview basado en la condición



fill datagridview c# (10)

He cargado los datos de la base de datos a datagridview y tengo dos columnas, valor objetivo y volumen, donde volumen> valor objetivo esa celda de volumen debe estar en color verde y volumen <valor objetivo, entonces el volumen debe estar en color rojo. Lo intenté pero no puedo hacerlo.

private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { if (dataGridView1.Rows.Count > 0 && dataGridView1.Columns.Count > 0) { foreach (DataGridViewRow r in dataGridView1.Rows) { if (Volume > target value) { cell.Style.BackColor = Color.AliceBlue; }


Digamos que tienes que colorear ciertas celdas (no todas las celdas de la fila) al saber dos cosas:

  1. Nombre o índice de la columna.
  2. Valor que va a estar dentro de la celda.

En este caso tienes que usar el evento CellFormatting

En mi caso lo uso así.

private void DgvTrucksMaster_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { foreach (DataGridViewRow row in dgvTrucksMaster.Rows) { if (Convert.ToInt32(row.Cells["Decade1Hours"].Value) > 0) { row.Cells["Decade1Hours"].Style.BackColor = Color.LightGreen; } else if (Convert.ToInt32(row.Cells["Decade1Hours"].Value) < 0) { // row.DefaultCellStyle.BackColor = Color.LightSalmon; // Use it in order to colorize all cells of the row row.Cells["Decade1Hours"].Style.BackColor = Color.LightSalmon; } } }

Y el resultado se puede ver aquí.

Así que aquí puede acceder a cierta celda de la fila en la columna por su nombre row.Cells ["Decade1Hours"]

¿Cómo sabes este nombre? Bueno en mi caso creo una columna de DataGridView como esta.

var Decade1Hours = new DataGridViewTextBoxColumn() { Name = "Decade1Hours", Width = 50, DataPropertyName = "Decade1Hours", ReadOnly = true, DefaultCellStyle = new DataGridViewCellStyle() { Alignment = DataGridViewContentAlignment.MiddleCenter, ForeColor = System.Drawing.Color.Black, Font = new Font(font, FontStyle.Bold), Format = "n2" }, HeaderCell = new DataGridViewColumnHeaderCell() { Style = new DataGridViewCellStyle() { Alignment = DataGridViewContentAlignment.MiddleCenter, BackColor = System.Drawing.Color.Blue } } }; Decade1Hours.HeaderText = "Дек.1"; dgvTrucksMaster.Columns.Add(Decade1Hours);

Y bueno ... usted necesita, por ejemplo, colorear algunas de las celdas en la fila como ## 1 4 5 y 8, tiene que usar el índice de celdas (comienza desde 0).

Y el código se verá como

private void DgvTrucksMaster_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { foreach (DataGridViewRow row in dgvTrucksMaster.Rows) { if (Convert.ToInt32(row.Cells[1].Value) > 0 ) { row.Cells[1].Style.BackColor = Color.LightGreen; } } }


Las respuestas de Kyle y Simon son una gran pérdida de recursos de CPU. CellFormatting eventos CellFormatting y CellPainting ocurren demasiadas veces y no deben usarse para aplicar estilos. Aquí hay dos mejores maneras de hacerlo:

Si su DataGridView o al menos las columnas que deciden el estilo de celda son de solo lectura, debe cambiar DefaultCellStyle de las filas en el evento RowsAdded . Este evento ocurre solo una vez cuando se agrega una nueva fila. La condición debe evaluarse en ese momento y DefaultCellStyle de la fila debe establecerse allí. Tenga en cuenta que este evento ocurre también en situaciones de DataBound.

Si su DataGridView o esas columnas permiten la edición, debe usar los eventos CellEndEdit o CommitEdit para cambiar DefaultCellStyle .


Puedo sugerir NO hacer un ciclo en cada fila CADA vez que se llame a CellFormating, porque se llama cada vez que se debe actualizar una FILA ÚNICA.

Private Sub dgv_DisplayData_Vertical_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dgv_DisplayData_Vertical.CellFormatting Try If dgv_DisplayData_Vertical.Rows(e.RowIndex).Cells("LevelID").Value.ToString() = "6" Then e.CellStyle.BackColor = Color.DimGray End If If dgv_DisplayData_Vertical.Rows(e.RowIndex).Cells("LevelID").Value.ToString() = "5" Then e.CellStyle.BackColor = Color.DarkSlateGray End If If dgv_DisplayData_Vertical.Rows(e.RowIndex).Cells("LevelID").Value.ToString() = "4" Then e.CellStyle.BackColor = Color.SlateGray End If If dgv_DisplayData_Vertical.Rows(e.RowIndex).Cells("LevelID").Value.ToString() = "3" Then e.CellStyle.BackColor = Color.LightGray End If If dgv_DisplayData_Vertical.Rows(e.RowIndex).Cells("LevelID").Value.ToString() = "0" Then e.CellStyle.BackColor = Color.White End If Catch ex As Exception End Try End Sub


Sé que este es un post antiguo, pero encontré mi camino aquí en 2018, así que tal vez alguien más también lo hará. En mi opinión, el OP tuvo un mejor enfoque (utilizando el evento dgv_DataBindingComplete) que cualquiera de las respuestas proporcionadas. Al momento de escribir, todas las respuestas se escriben usando eventos de pintura o eventos de formateo celular que parecen ineficientes.

El OP estaba al 99% del camino, todo lo que tenían que hacer era recorrer sus filas, probar el valor de celda de cada fila y establecer el BackColor, ForeColor o cualquier otra propiedad que desea establecer.

Por favor, disculpe la sintaxis de vb.NET, pero creo que está lo suficientemente cerca de C # para que sea claro.

Private Sub dgvFinancialResults_DataBindingComplete Handles dgvFinancialResults.DataBindingComplete Try Logging.TraceIt() For Each row As DataGridViewRow in dgvFinancialResults.Rows Dim invoicePricePercentChange = CSng(row.Cells("Invoice Price % Change").Value) Dim netPricePercentChange = CSng(row.Cells("Net Price % Change").Value) Dim tradespendPricePercentChange = CSng(row.Cells("Trade Spend % Change").Value) Dim dnnsiPercentChange = CSng(row.Cells("DNNSI % Change").Value) Dim cogsPercentChange = CSng(row.Cells("COGS % Change").Value) Dim grossProfitPercentChange = CSng(row.Cells("Gross Profit % Change").Value) If invoicePricePercentChange > Single.Epsilon Then row.Cells("Invoice Price % Change").Style.ForeColor = Color.Green Else row.Cells("Invoice Price % Change").Style.ForeColor = Color.Red End If If netPricePercentChange > Single.Epsilon Then row.Cells("Net Price % Change").Style.ForeColor = Color.Green Else row.Cells("Net Price % Change").Style.ForeColor = Color.Red End If If tradespendPricePercentChange > Single.Epsilon Then row.Cells("Trade Spend % Change").Style.ForeColor = Color.Green Else row.Cells("Trade Spend % Change").Style.ForeColor = Color.Red End If If dnnsiPercentChange > Single.Epsilon Then row.Cells("DNNSI % Change").Style.ForeColor = Color.Green Else row.Cells("DNNSI % Change").Style.ForeColor = Color.Red End If If cogsPercentChange > Single.Epsilon Then row.Cells("COGS % Change").Style.ForeColor = Color.Green Else row.Cells("COGS % Change").Style.ForeColor = Color.Red End If If grossProfitPercentChange > Single.Epsilon Then row.Cells("Gross Profit % Change").Style.ForeColor = Color.Green Else row.Cells("Gross Profit % Change").Style.ForeColor = Color.Red End If Next Catch ex As Exception Logging.ErrorHandler(ex) End Try End Sub


Sin bucle se puede lograr como a continuación.

private void dgEvents_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) { FormatRow(dgEvents.Rows[e.RowIndex]); } private void FormatRow(DataGridViewRow myrow) { try { if (Convert.ToString(myrow.Cells["LevelDisplayName"].Value) == "Error") { myrow.DefaultCellStyle.BackColor = Color.Red; } else if (Convert.ToString(myrow.Cells["LevelDisplayName"].Value) == "Warning") { myrow.DefaultCellStyle.BackColor = Color.Yellow; } else if (Convert.ToString(myrow.Cells["LevelDisplayName"].Value) == "Information") { myrow.DefaultCellStyle.BackColor = Color.LightGreen; } } catch (Exception exception) { onLogs?.Invoke(exception.Message, EventArgs.Empty); } }


Sorprendido, nadie mencionó una declaración simple if puede asegurar de que su bucle solo se ejecute una vez por formato (en la primera columna, de la primera fila).

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { // once per format if (e.ColumnIndex == 0 && e.RowIndex == 0) { foreach (DataGridViewRow row in dgv.Rows) if (row != null) row.DefaultCellStyle.BackColor = Color.Red; } }


Usted necesita hacer ésto

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { foreach (DataGridViewRow Myrow in dataGridView1.Rows) { //Here 2 cell is target value and 1 cell is Volume if (Convert.ToInt32(Myrow .Cells[2].Value)<Convert.ToInt32(Myrow .Cells[1].Value))// Or your condition { Myrow .DefaultCellStyle.BackColor = Color.Red; } else { Myrow .DefaultCellStyle.BackColor = Color.Green; } } }

Mientras tanto, también echar un vistazo a formato de celda


hazlo simple

private void dataGridView1_cellformatting(object sender,DataGridViewCellFormattingEventArgs e) { var amount = (int)e.Value; // return if rowCount = 0 if (this.dataGridView1.Rows.Count == 0) return; if (amount > 0) e.CellStyle.BackColor = Color.Green; else e.CellStyle.BackColor = Color.Red; }

echar un vistazo a CellFormatting


//After Done Binding DataGridView Data foreach(DataGridViewRow DGVR in DGV_DETAILED_DEF.Rows) { if(DGVR.Index != -1) { if(DGVR.Cells[0].Value.ToString() == "البدلات") { CurrRType = "البدلات"; DataGridViewCellStyle CS = DGVR.DefaultCellStyle; CS.BackColor = Color.FromArgb(0,175,100); CS.ForeColor = Color.FromArgb(0,32,15); CS.Font = new Font("Times New Roman",12,FontStyle.Bold); CS.SelectionBackColor = Color.FromArgb(0,175,100); CS.SelectionForeColor = Color.FromArgb(0,32,15); DataGridViewCellStyle LCS = DGVR.Cells[DGVR.Cells.Count - 1].Style; LCS.BackColor = Color.FromArgb(50,50,50); LCS.SelectionBackColor = Color.FromArgb(50,50,50); } else if(DGVR.Cells[0].Value.ToString() == "الإستقطاعات") { CurrRType = "الإستقطاعات"; DataGridViewCellStyle CS = DGVR.DefaultCellStyle; CS.BackColor = Color.FromArgb(175,0,50); CS.ForeColor = Color.FromArgb(32,0,0); CS.Font = new Font("Times New Roman",12,FontStyle.Bold); CS.SelectionBackColor = Color.FromArgb(175,0,50); CS.SelectionForeColor = Color.FromArgb(32,0,0); DataGridViewCellStyle LCS = DGVR.Cells[DGVR.Cells.Count - 1].Style; LCS.BackColor = Color.FromArgb(50,50,50); LCS.SelectionBackColor = Color.FromArgb(50,50,50); } } }


foreach (DataGridViewRow row in dgvWebData.Rows) { if (Convert.ToString(row.Cells["IssuerName"].Value) != Convert.ToString(row.Cells["SearchTermUsed"].Value)) { row.DefaultCellStyle.BackColor = Color.Yellow; } else { row.DefaultCellStyle.BackColor = Color.White; } }

Esto perfectamente funcionó para mí. incluso si se cambia una fila, el mismo evento se encarga.