Задать вопрос
kykyryky
@kykyryky

Почему тормозит dataGridView?

Есть проект WinForms, на нем dataGridView и в конструкторе формы следующий код:

dataGridView1.RowCount = 36;
dataGridView1.ColumnCount = 30;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dataGridView1.Font = new Font(dataGridView1.Font, FontStyle.Bold);

Так же свойство грида Dock = Fill.
Вроде бы строк и столбцов всего ничего, но при плавном изменении размеров формы начинаются жуткие тормоза.
Так же в обработчике события KeyDown есть код, который при нажатии на пробел красит в разные цвета ячейку грида в зависимости от её содержимого:
if (e.KeyCode == Keys.Space)
{
    char ch = Convert.ToChar(dataGridView1.Rows[currentRow].Cells[currentCol].Value);
    if(ch == defaultChar)
        dataGridView1.Rows[currentRow].Cells[currentCol].Style.BackColor = Color.GreenYellow;
    else dataGridView1.Rows[currentRow].Cells[currentCol].Style.BackColor = Color.Coral;
}

И тут так же, при покраске ячейки появляется короткое, но заметное и критичное для моей задачи подвисание около 0,5 секунды(требуется сразу же с помощью клавиатуры переместиться на следующую ячейку). Если сделать таблицу размером 10х15, то лага почти нет, он еле заметен, но всё же. Приложение запускается на машине с i7-4790 3.6 Ггц.

Почему так тормозит dataGridView и можно ли как-то это исправить?
  • Вопрос задан
  • 2273 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
DoubleBuffered = true
Попытка,не пытка.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@Free_ze
Пишу комментарии в комментарии, а не в ответы
DataGridView в принципе тормозит при большом количестве данных (гугл подтвердит). Можно сделать пейждинг или...кастомный грид.
Ответ написан
Комментировать
dmitry_pavlov
@dmitry_pavlov
World-class .NET freelance contractor (remotely)
На какой строчке кода тормозит? Замерьте.

var watch = System.Diagnostics.Stopwatch.StartNew();
// ваш код
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);


Проверьте свойство грида AutoSizeColumnsMode - поcтавьте его в None. Дает эффект? Еще можно проверить у каждого столбца свойство AutoSizeMode.

Ну и заведите переменную что ли - раз уж доступ к ней в любом случае 2 раза.

var cell = dataGridView1.Rows[currentRow].Cells[currentCol];
Ответ написан
Комментировать
Rou1997
@Rou1997
Можно на WPF перейти, там DataGrid рисуется посредством DirectX, поэтому отрисовка ускорится, но запуск приложения замедлится, потребление ОЗУ увеличится, удобство разработки снизится, сам DataGrid сильно отличается от DataGridView.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы