Изменение цвета строки вида в зависимости от условия - PullRequest
0 голосов
/ 25 января 2019

Я загрузил данные из базы данных в DatagridView и у меня есть некоторые бронирования автомобилей с датами начала и окончания.Таким образом, загрузка данных не является проблемой.StartDate и Shortdate в моей базе данных - это shortdatabase, я имею в виду только даты без времени.Мне нравится следующий, чтобы загрузить их, и я хочу, чтобы те строки, которые такие же, как сегодня или старше, чем сегодня, я хочу иметь красный цвет.Я имею в виду ForeColore = red.Как я могу это сделать?

DateTime today = DateTime.Now;
var shortDate = today.Date.AddDays(0);

var ReservedCars = (from r in db.Reservation 
                    select new
                    {
                      ReservationID = r.ReservationId,
                      Startdate = r.StartDate,
                      Enddate = r.EndDate 
                    }).ToList();


            dgvReservedRooms.DataSource = ReservedCars; 
            DateTime today = DateTime.Now;
            var shortDate = today.Date.AddDays(0);

// I tried like this but doesn't work with colors, please help...
 foreach (DataGridViewRow row in dgvReservedCars.Rows)
            { 
                foreach (var re in ReservedCars)
                {
                    if (re.Enddate <= shortDate)
                    {
                        row.DefaultCellStyle.BackColor = Color.Red;
                    }
                }
            }

1 Ответ

0 голосов
/ 25 января 2019

Я вижу пару вероятных проблем. Во-первых: ваше заявление о том, что делает проверки цвета. Для каждой строки в сетке данных он проходит все резервирования (не только резервирование, связанное с этой строкой), и если у какой-либо из них есть Enddate <= today, тогда эта строка становится красной. Так что, если у каких-либо резервирований есть Конечная дата <= сегодня, все они будут окрашены в красный цвет. Вместо этого вам нужно проверить, имеет ли резервирование, связанное с этой строкой, Конечную дату <= сегодня. </p>

Во-вторых, вам нужно поместить изменения стиля строки в событие DataBindingComplete для DataGridView, а не в ту же функцию, которая устанавливает источник данных. Я полагаю, что вы столкнулись с той же проблемой, на которую был дан ответ: https://stackoverflow.com/a/13560694/2263392

Итак, с обоими этими изменениями код выглядит примерно так:

public Form1()
{
    InitializeComponent();

    DateTime today = DateTime.Now;
    var shortDate = today.Date.AddDays(0);

    var ReservedCars = (from r in db.Reservation 
        select new ReservationRow(
            r.ReservationId,
            r.StartDate,
            r.EndDate)).ToList();

    dgvReservedCars.DataSource = ReservedCars;
}

private void dgvReservedCars_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    DateTime today = DateTime.Now;
    var shortDate = today.Date.AddDays(0);

    foreach (DataGridViewRow row in dgvReservedCars.Rows)
    {
        ReservationRow res = row.DataBoundItem as ReservationRow;
        if (res.EndDate <= shortDate)
        {
            row.DefaultCellStyle.BackColor = Color.Red;
        }
    }
}

Где ReservationRow - это просто:

public class ReservationRow
{
    public int ReservationId { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }

    public ReservationRow(int id, DateTime startDate, DateTime endDate)
    {
        ReservationId = id;
        StartDate = startDate;
        EndDate = endDate;
    }
}
...