如何更改datagridview中的行颜色?

我想改变我的datagridview中的特定行的颜色。 当columncell 7的值小于columncell 10的值时,该行应该变为红色。关于如何完成这个任务的任何build议?

您需要循环访问datagridview中的行,然后比较每行中第7列和第10列的值。

尝试这个:

foreach (DataGridViewRow row in vendorsDataGridView.Rows) if (Convert.ToInt32(row.Cells[7].Value) < Convert.ToInt32(row.Cells[10].Value)) { row.DefaultCellStyle.BackColor = Color.Red; } 

我只是在调查这个问题(所以我知道这个问题已经发布了将近3年前,但也许会帮助别人…),但似乎更好的select是放置在RowPrePaint事件的代码,不得不遍历每行,只有那些被绘制的(所以它会在大量的数据上performance更好:

附加到事件

 this.dataGridView1.RowPrePaint += new System.Windows.Forms.DataGridViewRowPrePaintEventHandler( this.dataGridView1_RowPrePaint); 

事件代码

 private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) { if (Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[7].Text) < Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[10].Text)) { dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige; } } 

您正在寻找CellFormatting事件。
这是一个例子。

我也很难改变文字颜色 – 我从来没有看到颜色的变化。

直到我添加代码来更改DataGridView的事件DataBindingsComplete的文本颜色。 之后,它的工作。

我希望这会帮助那些面临同样问题的人。

像下面这样…假设单元格中的值是整数。

 foreach (DataGridViewRow dgvr in myDGV.Rows) { if (dgvr.Cells[7].Value < dgvr.Cells[10].Value) { dgvr.DefaultCellStyle.ForeColor = Color.Red; } } 

未经testing,所以任何错误的道歉。

如果你知道特定的行,你可以跳过迭代:

 if (myDGV.Rows[theRowIndex].Cells[7].Value < myDGV.Rows[theRowIndex].Cells[10].Value) { dgvr.DefaultCellStyle.ForeColor = Color.Red; } 

有些人喜欢使用PaintCellPaintingCellFormatting事件,但请注意,在这些事件中更改样式会导致recursion调用。 如果您使用DataBindingComplete它将只执行一次。 CellFormatting的参数是仅在可见单元格上调用它,因此您不必格式化不可见的单元格,但可以多次格式化它们。

 private void dtGrdVwRFIDTags_DataSourceChanged(object sender, EventArgs e) { dtGrdVwRFIDTags.Refresh(); this.dtGrdVwRFIDTags.Columns[1].Visible = false; foreach (DataGridViewRow row in this.dtGrdVwRFIDTags.Rows) { if (row.Cells["TagStatus"].Value != null && row.Cells["TagStatus"].Value.ToString() == "Lost" || row.Cells["TagStatus"].Value != null && row.Cells["TagStatus"].Value.ToString() == "Damaged" || row.Cells["TagStatus"].Value != null && row.Cells["TagStatus"].Value.ToString() == "Discarded") { row.DefaultCellStyle.BackColor = Color.LightGray; row.DefaultCellStyle.Font = new Font("Tahoma", 8, FontStyle.Bold); } else { row.DefaultCellStyle.BackColor = Color.Ivory; } } //for (int i= 0 ; i<dtGrdVwRFIDTags.Rows.Count - 1; i++) //{ // if (dtGrdVwRFIDTags.Rows[i].Cells[3].Value.ToString() == "Damaged") // { // dtGrdVwRFIDTags.Rows[i].Cells["TagStatus"].Style.BackColor = Color.Red; // } //} } 

您可以使用您的条件逐行更改Backcolor ,并在应用DatagridView Datasource之后调用此函数。

这是这个function。 只需将其复制并放在Databind之后

 private void ChangeRowColor() { for (int i = 0; i < gvItem.Rows.Count; i++) { if (BindList[i].MainID == 0 && !BindList[i].SchemeID.HasValue) gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#C9CADD"); else if (BindList[i].MainID > 0 && !BindList[i].SchemeID.HasValue) gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#DDC9C9"); else if (BindList[i].MainID > 0) gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#D5E8D7"); else gvItem.Rows[i].DefaultCellStyle.BackColor = Color.White; } } 

这是我的解决scheme,使用bindingDataSource将颜色更改为dataGridView:

 private void dataGridViewECO_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { if (e.ListChangedType != ListChangedType.ItemDeleted) { DataGridViewCellStyle green = this.dataGridViewECO.DefaultCellStyle.Clone(); green.BackColor = Color.Green; DataGridViewCellStyle gray = this.dataGridViewECO.DefaultCellStyle.Clone(); gray.BackColor = Color.LightGray; foreach (DataGridViewRow r in this.dataGridViewECO.Rows) { if (r.Cells[8].Value != null) { String stato = r.Cells[8].Value.ToString(); if (!" Open ".Equals(stato)) { r.DefaultCellStyle = gray; } else { r.DefaultCellStyle = green; } } } } } 

如果绑定到具体对象的(集合),则可以通过该行的DataBoundItem属性获取该具体对象。 (为了避免检查单元格中的魔术string,并使用对象的“真实”属性)

下面的骨架例子:

DTO / POCO

 public class Employee { public int EmployeeKey {get;set;} public string LastName {get;set;} public string FirstName {get;set;} public bool IsActive {get;set;} } 

绑定到datagridview

  private void BindData(ICollection<Employee> emps) { System.ComponentModel.BindingList<Employee> bindList = new System.ComponentModel.BindingList<Employee>(emps.OrderBy(emp => emp.LastName).ThenBy(emp => emp.FirstName).ToList()); this.dgvMyDataGridView.DataSource = bindList; } 

然后事件处理程序和获取具体对象(而不是DataGridRow和/或单元格)

  private void dgvMyDataGridView_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) { Employee concreteSelectedRowItem = this.dgvMyDataGridView.Rows[e.RowIndex].DataBoundItem as Employee; if (null != concreteSelectedRowItem && !concreteSelectedRowItem.IsActive) { dgvMyDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightGray; } } 

我通常喜欢使用GridView.RowDataBound事件事件。

 protected void OrdersGridView_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.ForeColor = System.Drawing.Color.Red; } } 

在Visual Studio 2010上工作(我试过了,它工作!) 它会画你的整个行。

  1. datagridview创build一个button。
  2. 创build一个CellClick事件,并把下一行代码放在里面。

 if (dataGridView3.Columns[e.ColumnIndex].Index.Equals(0) { dataGridView3.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige; } 

你没有提到如何改变价值。 用户input值时,我使用了类似的function。 即进入和离开编辑模式。

使用datagridview的CellEndEdit事件。

 private void dgMapTable_CellEndEdit(object sender, DataGridViewCellEventArgs e) { double newInteger; if (double.TryParse(dgMapTable[e.ColumnIndex,e.RowIndex].Value.ToString(), out newInteger) { if (newInteger < 0 || newInteger > 50) { dgMapTable[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Red; dgMapTable[e.ColumnIndex, e.RowIndex].ErrorText = "Keep value in Range:" + "0 to " + "50"; } } } 

您可以添加类似的方式来清除错误通知的逻辑。

如果在你的情况下,如果数据是以编程方式加载的,那么CellLeave事件可以使用相同的代码。

有了这个代码,你只需要改变colcolname为null的行backcolor,其他行的颜色仍然是默认值。

  foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.Cells["columnname"].Value != null) { dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.MistyRose; } } 

只是关于设置DefaultCellStyle.BackColor一个注释…你不能将其设置为除Color.Empty之外的任何透明值。 这是默认值。 这对我来说(无论如何)是错误的,透明的颜色是可以的。 他们不是。 我设置为透明颜色的每一行都会绘制所选行的颜色。

在这个问题上,我花了太多的时间在墙上敲打。

int counter = gridEstimateSales.Rows.Count;

  for (int i = 0; i < counter; i++) { if (i == counter-1) { //this is where your LAST LINE code goes //row.DefaultCellStyle.BackColor = Color.Yellow; gridEstimateSales.Rows[i].DefaultCellStyle.BackColor = Color.Red; } else { //this is your normal code NOT LAST LINE //row.DefaultCellStyle.BackColor = Color.Red; gridEstimateSales.Rows[i].DefaultCellStyle.BackColor = Color.White; } }