动态更改 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.CellTemplatethis.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 单元格颜色的主要内容,如果未能解决你的问题,请参考以下文章

更改 datagridview 行中单个单元格的样式

对于使用“DataGridView”的 Windows 窗体应用程序,如何检查数据源中的值并更改单独单元格的颜色?

还原 datagridview 控件中的单元格样式更改?

用填充图案填充 DataGridView 单元格

如何更改数据网格中的单元格颜色

如何动态更改表格视图单元格的颜色