K
K
kykyryky2016-05-18 17:06:49
Programming
kykyryky, 2016-05-18 17:06:49

Why slows down dataGridView?

There is a WinForms project with a dataGridView and the following code in the form constructor:

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

Also the grid property Dock = Fill.
It seems that the rows and columns are nothing at all, but with a smooth change in the size of the form, terrible brakes begin.
Also, in the KeyDown event handler, there is a code that, when you click on the spacebar, paints a grid cell in different colors depending on its contents:
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 и можно ли как-то это исправить?

Answer the question

In order to leave comments, you need to log in

4 answer(s)

DoubleBuffered = true
Попытка,не пытка.

Толстый Лорри, 2016-05-18
@Free_ze

DataGridView в принципе тормозит при большом количестве данных (гугл подтвердит). Можно сделать пейждинг или...кастомный грид.

D
Dmitry Pavlov, 2016-05-18
@dmitry_pavlov

На какой строчке кода тормозит? Замерьте.

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

Проверьте свойство грида AutoSizeColumnsMode - поcтавьте его в None. Дает эффект? Еще можно проверить у каждого столбца свойство AutoSizeMode.
Ну и заведите переменную что ли - раз уж доступ к ней в любом случае 2 раза.
var cell = dataGridView1.Rows[currentRow].Cells[currentCol];

R
Rou1997, 2016-05-18
@Rou1997

Можно на WPF перейти, там DataGrid рисуется посредством DirectX, поэтому отрисовка ускорится, но запуск приложения замедлится, потребление ОЗУ увеличится, удобство разработки снизится, сам DataGrid сильно отличается от DataGridView.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question