Come migliorare le prestazioni di pittura DataGridView?
-
27-09-2019 - |
Domanda
(scusate per cattivo inglese)
Ho un grande problema con le prestazioni di DataGridView
quando si ri-vernici.
Io sto usando un DataGridView
per mostrare i log da un flusso di un'applicazione esterna. Messaggi dal flusso entrano con una frequenza elevata (meno di 1 ms). Se posso aggiungere nuova riga alla DataGridView
immediatamente quando ogni nuovo messaggio arriva, il DataGridView
non ha il tempo di ri-pittura stessa prima che il messaggio successivo viene.
Una possibile soluzione è quella di utilizzare una coda ai messaggi raccogliere e ri-paint DataGridView
ogni 100 ms con i messaggi dalla coda. Questo è un bene, ma lampeggia DataGridView
quando si auto-scorre fino all'ultima riga. (Scorrimento Smooth è disabilitata)
Mi potete aiutare a migliorare le prestazioni DataGridView
?
Soluzione
Recentemente ho avuto alcuni problemi di lentezza con DataGridView
e la soluzione è stata la seguente codice
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);
}
Si scopre il doppio buffering su per gli oggetti DataGridView
. Basta chiamare DoubleBuffered()
sul DGV. Speranza che aiuta.
Modifica:. Potrei aver ottenuto questo fuori così, ma non riesco a cercare il diritto originario ora così questo è solo per sottolineare che il codice non è mio
Altri suggerimenti
Hai attivato il doppio buffering per la visualizzazione a griglia?
dare un'occhiata a Horrible prestazioni ridisegno della DataGridView su una dei miei due schermi
Se non l'hai già per alcune idee
Pulisci soluzione senza riflessione è:
public class DataGridViewDoubleBuffered : DataGridView
{
public DataGridViewDoubleBuffered()
{
DoubleBuffered = true;
}
}
Poi vai a myForm.designer.cs e cambiare un tipo da DataGridView a DataGridViewDoubleBuffered.
Anche leggere articolo di MSDN: Procedure consigliate per ridimensionare il controllo DataGridView Windows Form
Quando si lavora con grandi quantità di dati, il controllo DataGridView
può consumare una grande quantità di memoria in testa, a meno che non lo si utilizza con attenzione. Sui client con memoria limitata, è possibile evitare alcune di queste spese generali, evitando le caratteristiche che hanno un costo di memoria ad alta.
È anche possibile gestire alcuni o tutti i dati di manutenzione e le attività di recupero da soli, usando modalità virtuale al fine di personalizzare l'utilizzo della memoria per lo scenario. Maggiori dettagli si può visitare dapfor. com
io uso questa soluzione e sega bit fissa.
La riflessione è usato così importare anche questo nel codice
using System.Reflection;
typeof(DataGridView).InvokeMember("DoubleBuffered",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
null,this.dataGridView1,new object[] { true });