C#迭代DataGridView并更改行颜色

我有一个由多行和多列组成的datagridview。 我想迭代每一行并检查特定列的内容。 如果该列包含单词“NO”,我想将整行的前景色更改为红色。 到目前为止,这是对某些代码的尝试,但它肯定无法工作,开始怀疑我是否需要迭代每个单元格?

码:

foreach (DataGridViewRow dgvr in dataGridView1.Rows) { if (dgvr.Cells["FollowedUp"].Value.ToString() == ("No")) { dgvr.DefaultCellStyle.ForeColor = Color.Red; } } 

挂起OnRowDataBound事件然后做东西

ASPX(网格):

   

代码背后:

  protected void RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowIndex == -1) { return; } if(e.Row.Cells[YOUR_COLUMN_INDEX].Text=="NO"){ e.Row.BackColor=Color.Red; } } 

对于WinForms:

 hook the **DataBindingComplete** event and do stuff in it: private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { if (e.ListChangedType != ListChangedType.ItemDeleted) { DataGridViewCellStyle red = dataGridView1.DefaultCellStyle.Clone(); red.BackColor=Color.Red; foreach (DataGridViewRow r in dataGridView1.Rows) { if (r.Cells["FollowedUp"].Value.ToString() .ToUpper().Contains("NO")) { r.DefaultCellStyle = red; } } } } 

在DataGridView上,处理CellFormatting事件:

 dataGridView1.CellFormatting += new DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting); 

您的事件处理程序可能如下所示:

 private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if(dataGridView1.Columns[e.ColumnIndex].Name == "FollowedUp" && e.Value != null && e.Value.ToString() == "No") dataGridView1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = Color.Red; } 

通过这种方式,您不会在行上“迭代” – 只需更改它们在网格中可见(因此需要格式化)时绘制/绘制的颜色。

 public void ColourChange() { DataGridViewCellStyle RedCellStyle = null; RedCellStyle = new DataGridViewCellStyle(); RedCellStyle.ForeColor = Color.Red; DataGridViewCellStyle GreenCellStyle = null; GreenCellStyle = new DataGridViewCellStyle(); GreenCellStyle.ForeColor = Color.Green; foreach (DataGridViewRow dgvr in dataGridView1.Rows) { if (dgvr.Cells["FollowedUp"].Value.ToString().Contains("No")) { dgvr.DefaultCellStyle = RedCellStyle; } if (dgvr.Cells["FollowedUp"].Value.ToString().Contains("Yes")) { dgvr.DefaultCellStyle = GreenCellStyle; } } } 

是否可能有空格或其他字符作为单元格值的一部分? 如果是这样,请尝试使用Contains方法而不是直接相等。

 if (dgvr.Cells["FollowedUp"].Value.ToString().Contains("No")) 

这是Winforms的解决方案:

 private void HighlightRows() { DataGridViewCellStyle GreenStyle = null; if (this.dgridv.DataSource != null) { RedCellStyle = new DataGridViewCellStyle(); RedCellStyle.BackColor = Color.Red; for (Int32 i = 0; i < this.dgridv.Rows.Count; i++) { if (((DataTable)this.dgridv.DataSource).Rows[i]["col_name"].ToString().ToUpper() == "NO") { this.dgridv.Rows[i].DefaultCellStyle = RedCellStyle; continue; } } } } 

这段代码对我来说很好:

foreach (DataGridViewRow row in dataGridView1.Rows) { if ((string)row.Cells["property_name"].Value == UNKNOWN_PROPERTY_NAME) { row.DefaultCellStyle.BackColor = Color.LightSalmon; row.DefaultCellStyle.SelectionBackColor = Color.Salmon; } }
foreach (DataGridViewRow row in dataGridView1.Rows) { if ((string)row.Cells["property_name"].Value == UNKNOWN_PROPERTY_NAME) { row.DefaultCellStyle.BackColor = Color.LightSalmon; row.DefaultCellStyle.SelectionBackColor = Color.Salmon; } } 

除了作为字符串进行转换而不是调用ToString之外我没有真正看到任何差异所以它可能是一个区分大小写的错误。 尝试使用:

 dgvr.Cells [“FollowedUp”]。Value.ToString()。ToUpper()==“NO”
 private void Grd_Cust_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { colorCode == 4 ? Color.Yellow : Color.Brown; if (e.RowIndex < 0 || Grd_Cust.Rows[e.RowIndex].Cells["FollowedUp"].Value == DBNull.Value) return; string colorCode = Grd_Cust.Rows[e.RowIndex].Cells["FollowedUp"].Value.ToString(); e.CellStyle.BackColor = colorCode == "NO" ? Color.Red : Grd_Cust.DefaultCellStyle.BackColor; }