Краткий ответ
Вы хотите установить стили в ячейке сетки, а не только в текущем сеансе форматирования ячейки. Вы красите неправильный CellStyle. Прямой доступ к стилю ячейки сетки вместо использования ячейки события, и ваш код будет делать то, что вы хотите (проверено на моей машине):
if (EMIDate1 <= DateTime.Today)
{
this.metroGrid1[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.DarkRed;
this.metroGrid1[e.ColumnIndex, e.RowIndex].Style.ForeColor = Color.White;
}
Длинный ответ
НЕ ДЕЛАЙТЕ ЭТОГО
- Событие форматирования будет применяться только к ячейкам VISIBLE
строки или столбцы скрыты, потому что элемент управления / окна слишком мал, не будет вызывать этот код
- Вы смешиваете логику форматирования (цвета) с бизнес-логикой (срок действия истек)
попробуйте выполнить эту проверку, прежде чем даже связывать сетку, или сделайте еще один вызов в базу данных
- Документация явно не одобряет слишком большой процесс внутри события форматирования ячейки.
https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.datagridview.cellformatting?view=netframework-4.7.2#remarks
- Этот код будет выполняться каждый раз, когда происходит перерисовка окна, наведение мыши и т. Д., Что делает ваш ярлык одним из самых дорогих ярлыков в вашей программе
Вы должны сделать это считая только один раз
Полный рабочий пример
Создайте приложение в форме окна, используя только одно представление данных и метку
public Form1()
{
InitializeComponent();
dataGridView1.DataSource = new[] {
new {Title = "bella", Date1 = DateTime.Now.AddDays(1)},
new {Title = "ciao", Date1 = DateTime.Now.AddDays(12)},
new {Title = "bella", Date1 = DateTime.Now.AddDays(-1)},
new {Title = "ciao", Date1 = DateTime.Now.AddDays(-31)},
new {Title = "bella", Date1 = DateTime.Now.AddDays(11)},
new { Title= "ciao", Date1 = DateTime.Today} ,
new { Title= "ciao", Date1 = DateTime.Today} ,
new { Title= "ciao", Date1 = DateTime.Today.AddDays(-7)} };
}
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (dataGridView1.Columns[e.ColumnIndex].DataPropertyName == "Date1")
{
var date = dataGridView1.Rows[e.RowIndex].Cells["Date1"].Value as DateTime?;
if (date.HasValue && date.Value <= DateTime.Today)
{
dataGridView1[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.DarkRed;
dataGridView1[e.ColumnIndex, e.RowIndex].Style.ForeColor = Color.White;
}
int countDarkRed = 0;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells["Date1"].Style.BackColor == Color.DarkRed)
countDarkRed++;
}
label1.Text = $"dark = {countDarkRed}";
}
}