Как улучшить производительность графики DataGridView?

(извините за плохой английский)

У меня проблема большая с производительностью DataGridView при повторной краске.

Я использую DataGridView для отображения журналов из внешнего потока приложений. Сообщения из потока поступают с высокой частотой (менее 1 мс). Если я добавляю новую строку в DataGridView сразу после появления каждого нового сообщения, DataGridView не успевает перекрасить себя до появления следующего сообщения.

Возможным решением является использование очереди для сбора сообщений и перекраска DataGridView каждые 100 мс сообщениями из очереди. Это хорошо, но DataGridView мигает, когда он автоматически прокручивается до последней строки. (Гладкая прокрутка отключена)

Можете ли вы помочь мне улучшить производительность DataGridView?

Ответы

Ответ 1

Недавно у меня были проблемы с медлительностью с DataGridView, и решение было следующим кодом

public static void DoubleBuffered(this DataGridView dgv, bool setting)
{
    Type dgvType = dgv.GetType();
    PropertyInfo pi = dgvType.GetProperty("DoubleBuffered",
          BindingFlags.Instance | BindingFlags.NonPublic);
    pi.SetValue(dgv, setting, null);
}

Он включает двойную буферизацию для объектов DataGridView. Просто позвоните DoubleBuffered() на свой DGV. Надеюсь, что это поможет.

Изменить: Я мог бы отключить это, но я не могу искать оригинал прямо сейчас, так что это просто подчеркнуть, что код не мой.

Ответ 3

Чистое решение без отражения:

public class DataGridViewDoubleBuffered : DataGridView
{
   public DataGridViewDoubleBuffered()
   {
       DoubleBuffered = true;
   }
}

Затем перейдите в myForm.designer.cs и измените тип из DataGridView на DataGridViewDoubleBuffered.

Ответ 5

При работе с большими объемами данных элемент управления DataGridView может потреблять большой объем памяти в накладных расходах, если вы не используете его осторожно. На клиентах с ограниченной памятью вы можете избежать некоторых из этих накладных расходов, избегая функций, которые имеют высокую стоимость памяти.

Вы также можете самостоятельно управлять некоторыми или всеми задачами по обслуживанию и извлечению данных, используя виртуальный режим, чтобы настроить использование памяти для вашего сценария. Более подробно вы можете посетить dapfor. ком

Ответ 6

Я использую это решение и фиксировал бит.

Отражение используется, поэтому импортируйте это тоже в код

using System.Reflection;

typeof(DataGridView).InvokeMember("DoubleBuffered",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
null,this.dataGridView1,new object[] { true });