Как изменить цвет ячейки в DataGridView, если дата за 1 месяц до того, что находится в ячейке? - PullRequest
0 голосов
/ 21 мая 2019

Я просматривал ЛОТ веб-сайтов, и я не нашел ничего страшного, Допустим, у меня есть DataGridView со столбцом и строками (при условии, что сегодняшняя дата 21/05/2019 (dd/mm/yyyy))

  • 22/05/2019

  • 22/04/2019

  • 21/01/2019

Итак, я хочу, чтобы первый был красным (потому что у него сегодня выходной день)
Я хочу, чтобы второй был оранжевым (потому что он вошел в отметку -1 месяц)
И последний должен быть нормальным, потому что он далек от -1 месяца.

Я пробовал это:

var dateminusonemonth = DateTime.Today.AddMonths(-1);   
foreach (DataGridViewRow row in dgproduit.Rows)
if (Convert.ToString(dateminusonemonth) = txtboxdatecontrole.Text)
{
     row.DefaultCellStyle.BackColor = Color.Red;
}

Но это совсем не работает, и я не знаю, где на это посмотреть ...

РЕДАКТИРОВАТЬ: Это то, что я хочу, но я не могу заставить его работать Изменить цвет строки в DataGridView на основе даты столбца

РЕДАКТИРОВАТЬ: Это сработало! с этим кодом:

 DateTime now = DateTime.Now, thirtyDaysAgo = now.AddDays(-30), expirationDate;

        foreach (DataGridViewRow row in dgproduit.Rows)
        {
            string cellText = row.Cells["datecontrole"].Value + "";

            if (DateTime.TryParse(cellText, out expirationDate))
            {
                if (expirationDate < now)
                    row.DefaultCellStyle.BackColor = Color.OrangeRed;
                else if (expirationDate > thirtyDaysAgo)
                    row.DefaultCellStyle.BackColor = Color.LightBlue;
            }
        }

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Когда у вас есть последовательности предметов, LINQ - ваш лучший друг

Предполагается, что столбец, который показывает даты, которые вы хотите закрасить, равен columnDate

DataGridViewColumn columnDate = ...
DataGridView myDataGridView = ...

var dateCells = myDataGridView.Rows.Cast<DataGridViewRow>()
    .Select(row => row.Cells[columnDate.Name])
    .Select(dateCell => new
    {
        DataGridViewCell = dateCell,
        Date = DateTime.Parse(dateCell.Value.ToString()).Date,
    });

Итак, Date содержит часть Date отображаемого значения в DateCell. Если вы не хотите сравнивать данные по дате, но по времени в течение 24 часов, вам следует запомнить дату и время.

Date = DateTime.Parse(dateCell.Value.ToString());

Теперь, чтобы получить клетки, которые вы хотите раскрасить:

DateTime today = DateTime.Today;

// The cells that have a date between (today - 1 day) and (today + 1 day) should be red:
var todayMinus1Day = today.AddDays(-1);
var todayPlus1Day = today.AddDays(+1);
var todayMinus1Month = today.AddMonths(-1);
var todayPlus1Month = today.AddMonths(+1)

 foreach (var cell in dateCells)
 {
     if (todayMinus1Month <= cell.Date && cell.Date <= todayPlus1Month)
     {
         // either orange or red: not default:
         cell.DataGridViewCell.Style = cell.DataGridViewCell.GetInheritedStyle();
         cell.DataGridViewCell.Style.BackColor =
             (todayMinums1Day <= cell.Date && cell.Date <= todayPlus1Day) ?
               Color.Red : Color.Orange;
     }
     else
     {   // use the inherited style = set the cell style to null
         cell.DataGridViewCell.Style = null;
     }
}
0 голосов
/ 21 мая 2019

Я не могу понять, что именно вам нужно, но я постараюсь.

var dateminusonemonth = DateTime.Today.AddMonths(-1);
        foreach (DataGridViewRow row in dgproduit.Rows)
        {
            DateTime DateToComapre = Datetime.Parse(row.Cells[Cell with you Date to Comapre].value); //Date format must match!
            if (DateTime.Now < DateToCompare)
            {
                row.DefaultCellStyle.BackColor = Color.Red;
            }
            else if (dateminusonemonth < DateToCompare && DateToCompare < DateTime.Now)
            {
                row.DefaultCellStyle.BackColor = Color.Orange;
            }
            else
            {
                 drow.RowHeadersDefaultCellStyle.SelectionBackColor = Color.Empty;
            }
        }
...