根据条件更改datagridview单元格颜色

我已经将数据从数据库加载到datagridview并且有两列目标值和体积,其中体积>目标值,体积单元格应为绿色,体积<目标值,然后体积应为红色。 我尝试过,但我无法做到。

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; } 

你需要这样做

 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) 

同时还要看一下Cell Formatting

我可能建议不要在每次调用CellFormating时循环遍历每一行,因为每次需要刷新一行时都会调用它。

 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 

Kyle和Simon的答案是对CPU资源的严重浪费。 CellFormattingCellPainting事件发生的次数太多,不应该用于应用样式。 以下是两种更好的方法:

如果DataGridView或至少决定单元格样式的列是只读的,则应更改RowsAdded事件中行的DefaultCellStyle。 添加新行时,此事件仅发生一次。 应该在那时评估条件,并且应该在其中设置行的DefaultCellStyle 。 请注意,DataBound情况也会发生此事件。

如果您的DataGridView或那些列允许编辑,您应该使用CellEndEditCommitEdit事件来更改DefaultCellStyle

 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; } } 

这完美地为我工作。 即使一行被改变,同样的事件也要小心。

假设您必须通过了解两件事来为某些单元格(不是该行的所有单元格)着色:

  1. 列的名称或索引。
  2. 价值将在细胞内部。

在这种情况下,您必须使用事件CellFormatting

在我的情况下,我使用这样的

 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; } } } 

结果你可以在这里看到

在此处输入图像描述

所以在这里你可以通过名称row.Cells [“Decade1Hours”]访问列中行的某个单元格

你怎么知道这个名字的? 在我的情况下,我像这样创建DataGridView列。

 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); 

好吧......你需要为行中的一些单元格着色,如## 1 4 5和8,你必须使用单元格索引(它从0开始)。

代码也会像

  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; } } } 

令人惊讶的是没有人提到一个简单的if语句可以确保你的循环只在每个格式执行一次(在第一行的第一列)。

  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; } } 

如果没有循环,它可以像下面一样实现。

 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); } } 

我知道这是一个老post,但我在2018年找到了我的路,所以也许其他人也会这样。 在我看来,OP比任何提供的答案都有更好的方法(使用dgv_DataBindingComplete事件)。 在撰写本文时,所有答案都是使用油漆事件或单元格格式化事件编写的,这些事件似乎效率低下。

OP是那里的99%,他们所要做的只是遍历他们的行,测试每行的单元格值,并设置BackColor,ForeColor或您想要设置的任何其他属性。

请原谅vb.NET语法,但我认为它与C#足够接近,应该清楚。

 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 
 //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); } } } 

让它变得简单

 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; } 

看一下单元格格式