Подсчет цветных ячеек в DataGridView - PullRequest
0 голосов
/ 20 марта 2019

Я работаю над приложением WinForm на основе доступа. У меня есть цветные ячейки (DateColumn) в моем DataGridView. Я пытаюсь посчитать цветные ячейки, как показано на рисунке, и хочу отразить общее количество цветных ячеек в тексте метки. Я попробовал приведенные ниже коды, которые не учитывают общее количество цветных ячеек в моем DataGridView, но подсчитывают общее количество строк. Точную проблему можно понять с помощью this image

Мои коды следующие:

private void metroGrid1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {

        if (this.metroGrid1.Columns[e.ColumnIndex].DataPropertyName == "Date 1")
            try
            {
                var EMIDate1 = Convert.ToDateTime(metroGrid1.Rows[e.RowIndex].Cells["date1DataGridViewTextBoxColumn"].Value);

                for (int i = 0; i < metroGrid1.RowCount; i++)
                {
                    if (EMIDate1 <= DateTime.Today)
                    {
                        int countDarkRed = 0;
                        e.CellStyle.BackColor = Color.DarkRed;
                        e.CellStyle.ForeColor = Color.White;
                        foreach (DataGridViewRow row in this.metroGrid1.Rows)
                        {

                            if (row.Cells["date1DataGridViewTextBoxColumn"].Style.BackColor == Color.DarkRed)
                            {
                                countDarkRed++;
                            }
                        }
                        labelEMI.Text = "Total EMI due as on today:" + countDarkRed;
                    }
                }
            }
            catch
            {
            }
    }

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Краткий ответ
Вы хотите установить стили в ячейке сетки, а не только в текущем сеансе форматирования ячейки. Вы красите неправильный 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}";
        }
    }
0 голосов
/ 20 марта 2019

Если вы ошиблись в предыдущем случае, вы проверяли только первую ячейку и продолжали увеличивать счет, теперь вы перепутали мои комментарии по предыдущему вопросу. Вот схема:

Существует один цикл if для проверки даты и изменения цвета, и один цикл for для подсчета количества ячеек, которые изменили цвет

private void metroGrid1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (this.metroGrid1.Columns[e.ColumnIndex].DataPropertyName == "Date 1")
    {
        try
        {
            int countDarkRed = 0;
            var EMIDate1 = Convert.ToDateTime(metroGrid1.Rows[e.RowIndex].Cells["date1DataGridViewTextBoxColumn"].Value);

            //Checking whether we have to turn it red or not
            if (EMIDate1 <= DateTime.Today)
            {
                e.CellStyle.BackColor = Color.DarkRed;
                e.CellStyle.ForeColor = Color.White;
            }

            //Checking how many cells have turned red
            foreach(DataGridViewRow row in this.metroGrid1.Rows)
            {
                if (row.Cells["date1DataGridViewTextBoxColumn"].Style.BackColor == Color.DarkRed)
                {
                    countDarkRed++;
                }
            }
            labelEMI.Text = "Total EMI due as on today:" + countDarkRed;
        }
        catch
        {

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...