C # Datagridview изменить цвет строки на основе условия только первые 1000 записей - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть небольшая проблема с моим datagridview. Я заполняю Datagridview своими записями из базы данных.

Но я хочу изменить задний и передний цвет в определенном состоянии. Он работает нормально, но только с первыми 1000 записями, и проблема в том, что у меня есть более 10.000 записей. Был ли у меня неправильный случай?

Я был бы благодарен за лучшее решение.

С уважением

мой код:

private void dataView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    foreach(DataGridViewRow row in dataView.Rows)
    {
        int value = Convert.ToInt32(row.Cells[2].Value);

        if(value == 1)
        {
            row.DefaultCellStyle.BackColor = Color.Orange;
        }
        else
        {
            row.DefaultCellStyle.BackColor = Color.White;
        }
    }
}

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Событие CellFormatting - не лучший вариант в вашем случае. Ваш цикл for заставляет вас многократно повторять свои данные.

Вы можете использовать события RowPrePaint, RowPostPaint или DataBindingComplete для своего сценария.

Использование RowPrePaint позволит вам раскрасить строку и оставить открытой опцию, чтобы применить дополнительные стили уровня ячеек для отдельных ячеек.

 private void dataView_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
 {
     DataGridViewRow row = dataView.Rows[e.RowIndex];
     if (Convert.ToInt32(row.Cells[2].Value) == 1)
     {
         row.DefaultCellStyle.BackColor = Color.Orange;
     }
     else
     {
         row.DefaultCellStyle.BackColor = Color.White;
     }
 }

Если вы решите сохранить цикл, вы можете использовать событие DataBindingComplete.

private void dataView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    foreach (DataGridViewRow row in dataView.Rows)
    {
        int value = Convert.ToInt32(row.Cells[2].Value);
        if (value == 1)
        {
            row.DefaultCellStyle.BackColor = Color.Orange;
        }
        else
        {
            row.DefaultCellStyle.BackColor = Color.White;
        }
    }
}
0 голосов
/ 06 ноября 2019

@ quaabaam

спасибо, первое решение сработало для меня. Могу ли я поменять 2 ячейки с этим событием? вот так:

private void DataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
        {
            DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
            //Secili olanlarin rengini degisdiriyo
            if (Convert.ToInt32(row.Cells["Secili"].Value) == 1)
            {
                this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightSalmon;
                this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = Color.Black;
            }
            else
            {
                //Aktiv olmiyanlari kirmizi yapiyo
                if (Convert.ToInt32(row.Cells["IsActive"].Value) == 1)
                {
                    this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
                    this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = Color.Black;
                }
                else
                {
                    this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
                    this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = Color.White;
                }
            }
        }

Редактировать:

У меня теперь другая проблема. Некоторые из первых 1000 записей затемнены. Я не знаю почему. Я использую функцию, которую я разместил здесь.

Изображение: Изображение

...