Come migliorare le prestazioni di pittura di DataGridView?

(Scusa per il pessimo inglese)

Ho un grosso problema con le prestazioni di DataGridView quando ri-dipinge.

Sto usando un DataGridView per mostrare i registri da un stream di applicazioni esterno. I messaggi dal stream arrivano con una frequenza alta (meno di 1 ms). Se aggiungo immediatamente una nuova riga a DataGridView quando arriva ogni nuovo messaggio, DataGridView non ha il tempo di ridipingere se stesso prima che arrivi il messaggio successivo.

Una ansible soluzione è utilizzare una coda per raccogliere i messaggi e ridipingere DataGridView ogni 100 ms con i messaggi dalla coda. Questo è buono ma il DataGridView lampeggia quando si scorre automaticamente fino all’ultima riga. (Lo scorrimento uniforms è disabilitato)

Puoi aiutarmi a migliorare le prestazioni di DataGridView ?

Recentemente ho avuto alcuni problemi di lentezza con DataGridView e la soluzione era il 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); } 

Attiva il doppio buffering per gli oggetti DataGridView . Basta chiamare DoubleBuffered() sul tuo DGV. Spero che sia d’aiuto.

Edit: Potrei aver ottenuto questo SO, ma non posso cercare l’originale in questo momento, quindi questo è solo per sottolineare che il codice non è mio.

Hai triggersto il doppio buffering per la visualizzazione griglia?

dare un’occhiata a Horrible ridisegna le prestazioni di DataGridView su uno dei miei due schermi

se non hai già qualche idea

Soluzione pulita senza riflessione è:

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

Quindi andare su myForm.designer.cs e modificare un tipo da DataGridView a DataGridViewDoubleBuffered.

Leggere anche l’articolo MSDN: Best practice per il ridimensionamento del controllo DataGridView di Windows Form

Quando si lavora con grandi quantità di dati, il controllo DataGridView può consumare una grande quantità di memoria in sovraccarico, a meno che non lo si usi con attenzione. Sui client con memoria limitata, è ansible evitare parte di questo overhead evitando le funzionalità che hanno un costo di memoria elevato.

È anche ansible gestire alcune o tutte le attività di gestione e recupero dei dati utilizzando la modalità virtuale per personalizzare l’utilizzo della memoria per il proprio scenario. Maggiori dettagli puoi visitare dapfor. com

io uso questa soluzione e ho visto bit riparato.

Si usa Reflection per importarlo anche in codice

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