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?

È stato utile?

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.

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 });
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top