Как улучшить производительность графики 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. Надеюсь, что это поможет.
Изменить: Я мог бы отключить это, но я не могу искать оригинал прямо сейчас, так что это просто подчеркнуть, что код не мой.
Ответ 2
Вы активировали двойную буферизацию для вида сетки?
взгляните на
Ужасная перерисовка данных DataGridView на одном из двух экранов
если у вас еще нет идей
Ответ 3
Чистое решение без отражения:
public class DataGridViewDoubleBuffered : DataGridView
{
public DataGridViewDoubleBuffered()
{
DoubleBuffered = true;
}
}
Затем перейдите в myForm.designer.cs и измените тип из DataGridView на DataGridViewDoubleBuffered.
Ответ 4
Также прочитайте статью MSDN:
Рекомендации по масштабированию управления DataGridView Windows Forms
Ответ 5
При работе с большими объемами данных элемент управления DataGridView
может потреблять большой объем памяти в накладных расходах, если вы не используете его осторожно. На клиентах с ограниченной памятью вы можете избежать некоторых из этих накладных расходов, избегая функций, которые имеют высокую стоимость памяти.
Вы также можете самостоятельно управлять некоторыми или всеми задачами по обслуживанию и извлечению данных, используя виртуальный режим, чтобы настроить использование памяти для вашего сценария. Более подробно вы можете посетить dapfor. ком
Ответ 6
Я использую это решение и фиксировал бит.
Отражение используется, поэтому импортируйте это тоже в код
using System.Reflection;
typeof(DataGridView).InvokeMember("DoubleBuffered",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
null,this.dataGridView1,new object[] { true });