当您有一些条件时,如何更改网格中单元格的颜色

本文关键字:网格 何更改 单元格 颜色 条件 | 更新日期: 2023-09-27 18:26:17

我想更改网格中整行的颜色。我在网格上方有两个复选框。一个处于活动状态,另一个处于非活动状态。当我点击活动时,我希望ExpirationDate(网格中列的名称)大于或等于今天DateTime的所有行都从白色变为咧嘴笑。当我点击非活动时,同样的东西变成了红色。过滤器活动和非活动都在工作,我只需要改变数据行的颜色。

我知道我可以使用cell_formating事件。这是代码,但我需要一些帮助。

 private void grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        Color active = Color.LightGreen;
        Color inactive = Color.LightPink;
        DataRowView drv = bindingSource[e.RowIndex] as DataRowView;
        switch (drv["ExpirationDate"].ToString())
        {
            case ???:
                grid.Rows[e.RowIndex].DefaultCellStyle.BackColor = active;
                break;
            case ???:
                grid.Rows[e.RowIndex].DefaultCellStyle.BackColor = inactive;
                break;
        }
    }

我不知道我应该在箱子里放些什么。因为,c需要常数值。当我把String.Format(" ExpirationDate>= '{0}' ", DateTime.Today)放在c的情况下时,抛出异常"错误44需要一个常数值"。知道我应该打什么吗?

当您有一些条件时,如何更改网格中单元格的颜色

没有人强迫您使用switch,在适当的时候使用if...else。但在这种情况下,您可以使用条件运算符简化代码:

private void grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    Color active = Color.LightGreen;
    Color inactive = Color.LightPink;
    DataRowView drv = bindingSource[e.RowIndex] as DataRowView;
    bool isActive = drv.Row.Field<DateTime>("ExpirationDate").Date >= DateTime.Today;
    grid.Rows[e.RowIndex].DefaultCellStyle.BackColor = isActive ? active : inactive;
}

我还使用DataRow扩展方法Field将对象强制转换为正确的类型DateTime,而不是将其转换为string,这可能会导致本地化问题。

我会使用bool,先进行检查,然后是if-else。它更易读,更清楚地表达了你的意图。

private void grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    Color active = Color.LightGreen;
    Color inactive = Color.LightPink;
    DataRowView drv = bindingSource[e.RowIndex] as DataRowView;
    bool expired =
        DateTime.Parse(drv["ExpirationDate"].ToString()) < DateTime.Today;
    if (expired)
    {
        grid.Rows[e.RowIndex].DefaultCellStyle.BackColor = inactive;
    }
    else
    {
        grid.Rows[e.RowIndex].DefaultCellStyle.BackColor = active;
    }
}