当您有一些条件时,如何更改网格中单元格的颜色
本文关键字:网格 何更改 单元格 颜色 条件 | 更新日期: 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;
}
}