Как улучшить производительность рисования DataGridView? - PullRequest
17 голосов
/ 23 ноября 2010

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

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

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

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

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

Ответы [ 6 ]

43 голосов
/ 23 ноября 2010

У меня недавно были некоторые проблемы с медлительностью с 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. Надеюсь, это поможет.

Редактировать: Возможно, я получил это от SO, но я не могу сейчас искать оригинал, так что я просто хочу подчеркнуть, что код не мой.

9 голосов
/ 23 ноября 2010

Вы включили двойную буферизацию для вида сетки?

взгляните на Ужасная производительность перерисовки DataGridView на одном из моих двух экранов

, если у вас естьне для некоторых идей

6 голосов
/ 08 января 2015

Чистый раствор без отражения:

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

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

3 голосов
/ 17 июля 2015

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

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

using System.Reflection;

typeof(DataGridView).InvokeMember("DoubleBuffered",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
null,this.dataGridView1,new object[] { true });
3 голосов
/ 16 ноября 2012

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

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

3 голосов
/ 25 декабря 2010
...