动态更改 datagridview 单元格颜色
Posted
技术标签:
【中文标题】动态更改 datagridview 单元格颜色【英文标题】:Changing datagridview cell color dynamically 【发布时间】:2013-07-18 15:40:00 【问题描述】:我有一个填充了数据的 dataGridView 对象。我想单击一个按钮并让它更改单元格背景的颜色。这是我目前拥有的
foreach(DataGridViewRow row in dataGridView1.Rows)
foreach(DataGridViewColumn col in dataGridView1.Columns)
//row.Cells[col.Index].Style.BackColor = Color.Green; //doesn't work
//col.Cells[row.Index].Style.BackColor = Color.Green; //doesn't work
dataGridView1[col.Index, row.Index].Style.BackColor = Color.Green; //doesn't work
所有这三个都会导致表格以重叠的方式重新绘制,并且尝试重新调整表格大小变得一团糟。单击单元格时,该值保持突出显示并且背景色不会改变。
问:表格存在后如何更改单个单元格的背景颜色?
【问题讨论】:
【参考方案1】:这对我有用
dataGridView1.Rows[rowIndex].Cells[columnIndex].Style.BackColor = Color.Red;
【讨论】:
@t4thilina,很高兴它有帮助。干杯:) 如果您在表单的构造函数中尝试这样做,它不会起作用。不过,它在 OnLoad 覆盖中对我有用。 我必须打电话给dataGridView1.Refresh()
才能改变颜色。 reset colours on rows sort 让我现在开始搜索...【参考方案2】:
实现您自己的 DataGridViewTextBoxCell 扩展并像这样覆盖 Paint 方法:
class MyDataGridViewTextBoxCell : DataGridViewTextBoxCell
protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex,
DataGridViewElementStates cellState, object value, object formattedValue, string errorText,
DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
if (value != null)
if ((bool) value)
cellStyle.BackColor = Color.LightGreen;
else
cellStyle.BackColor = Color.OrangeRed;
base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value,
formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
然后在代码中将列的 CellTemplate 属性设置为类的实例
columns.Add(new DataGridViewTextBoxColumn() CellTemplate = new MyDataGridViewTextBoxCell());
【讨论】:
大声笑,我之前为“警告”和“确定”选择了最佳颜色,最后我也为“警告”选择了Color.OrangeRed
,但为“确定”选择了Color.SpringGreen
。
也可以通过this.YourColumn.CellTemplate
或this.dataGridView.Columns["YourName"].CellTemplate
设置列的CellTemplate【参考方案3】:
感谢它的工作
这里我已经完成了,qty 字段为零意味着它显示单元格为红色
int count = 0;
foreach (DataGridViewRow row in ItemDg.Rows)
int qtyEntered = Convert.ToInt16(row.Cells[1].Value);
if (qtyEntered <= 0)
ItemDg[0, count].Style.BackColor = Color.Red;//to color the row
ItemDg[1, count].Style.BackColor = Color.Red;
ItemDg[0, count].ReadOnly = true;//qty should not be enter for 0 inventory
ItemDg[0, count].Value = "0";//assign a default value to quantity enter
count++;
【讨论】:
【参考方案4】:如果您希望网格中的每个单元格都具有相同的背景颜色,您可以这样做:
dataGridView1.DefaultCellStyle.BackColor = Color.Green;
【讨论】:
【参考方案5】:考虑使用 DataBindingComplete 事件来更新样式。下面的代码改变了单元格的样式:
private void Grid_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
this.Grid.Rows[2].Cells[1].Style.BackColor = Color.Green;
【讨论】:
以上是关于动态更改 datagridview 单元格颜色的主要内容,如果未能解决你的问题,请参考以下文章