Datagridview display molto lento [RISOLTO]

di il
18 risposte

18 Risposte - Pagina 2

  • Re: Datagridview display molto lento [RISOLTO]

    20/03/2024 - asql ha scritto:


    Salve Franco,

    Microsoft anni fa pubblico' una serie di faq e approfondimenti sulla DataGridView, che ora trovi disponibile presso https://documents.pub/document/data-grid-view-faq.html

    viene documentata anche la modalita' bound = Virtual, che mi pare ricordare effettuasse il caricamento della griglia “solo su necessita'”, cioe' “se non scrolli fino alla Nesima riga, non la carica sul controllo”…

    ovviamente e' tutto molto piu' “manuale”, in quanto devi rispondere ad eventi tipo CellValueNeeded etc, ma potrebbe essere una soluzione…

    salutoni romagnoli
    – 
    Andrea

    Ciao, grazie per il post…

    in passato su una datagridview ho adottato il sistema di impaginazione manuale. Dovevo caricare una sorta di log che in continuazione cresce senza limiti con decine di centinaia di migliaia di righe.
    Preventivamente adottai questa pratica in quanto pensai da subito che poteva essere un problema caricare tutte insieme un numero così elavato di righe e funziona benissimo. 
    In modo istantaneo ti muovi in una qualsiasi pagina … e impostai, con una textbox, anche la possibilità di variare il numero di righe massimo da caricare rendendolo ancora più flessibile per avere la possibilità di scorrere riga per riga e non solo pagina per pagina. 

    Però contiene solo 8 colonne e l'aspetto grafico non incide nella visualizzazione.


    Mentre in questo caso anche se ho pochissimi records da leggere che si traducono in pochissime righe da popolare nella datagridview, come puoi vedere fa molta fatica nel mostrare tutte le celle procedendo con una certa lentezza. 
    E in questo esempio si ha solo 1 pagina con 16 righe da visualizzare. (sempre tutto statico senza formattazioni e/o calcoli e controlli da eseguire… deve solo leggere e scrivere i valori nelle celle)

    Pertanto deduco che non è un problema di numero di records e di righe a degradare le prestazioni grafiche, ma è il numero elevato di colonne: 

  • Re: Datagridview display molto lento [RISOLTO]

    20/03/2024 - Sgrubak ha scritto:


    Ma hai provato a gestire la DoubleBuffered? Alka suggeriva di disabilitarla, ma secondo me non ce l'hai attivata.

    Ciao Sgrubak

    grazie per la dritta e in men che non si dica ho RISOLTO

    Purtroppo il controllo datagridview non ha una proprietà DoubleBuffered , ma creando una Classe di Estensione si riesce a creare il metodo anche per la datagridview.

    Pertanto ho aggiunto una classe in name space per costruire il metodo doublebuffered in questo modo:
    (se il metodo è valido e consono poi lo inserirò nella mia libreria dll generale per rendere la classe fruibile per tutti i progetti dove necessita)

    
        // CLASS EXTENSION METHODS - DATAGRIDVIEW PERFORMANCE MANAGEMENT
        public static class MyExtensionMethods
        {
            // PUBLIC DOUBLE BUFFERED METHOD
            public static void MyDoubleBuffered(this DataGridView dgv, bool setting)
            {
                // get type and property info
                var dgvType = dgv.GetType();
                var pInfo = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
                // set value
                pInfo.SetValue(dgv, setting, null);
            }
        }
    

    In Form Load ho aggiuto il richiamo al metodo da associare alla datagridview in questione::

            // FORM LOAD
            private void FormTabelloneRitardi_Load(object sender, EventArgs e)
            {
                // create datatable tabellone for datagridview
                MyCreateDataTableColumns();
    
                // set datagridview double buffered
     ---->>>    DgvTab.MyDoubleBuffered(true);     <<<----
    
                // load datagridview
                MyDatagridviewCreateLoad();
            }
    

    Basta! non ho fatto altro … rispetto al codice e all'impostazioni originali del progetto.

    Il risultato è più che soddisfacente, in pratica la datagridview risponde in modo istantaneo senza nessun tipo di latenza nella gestione della grafica.

    Esempio: Adesso risponde così…

    Mentre prima era così:

    (una bella differenza)


    Io direi che è perfetto !!! ;-)

    Preso visione della documentazione l'unico aspetto che ritengo importante, in questo caso specifico, è relativo al consumo della memoria e della cpu.
    Ho stressato con test più volte l'applicazione e non ho registrato nessun incremento nel consumo di memoria e cpu… i valori sono identici a quelli che avevo prima senza il doublebuffered.

    Che dire… ti ringrazio per la dritta e ringrazio tutti gli altri per i loro contributi.

    Un saluto a tutti.

    ;-) e grazie di nuovo a tutti

  • Re: Datagridview display molto lento [RISOLTO]

    20/03/2024 - By65Franco ha scritto:


    Purtroppo il controllo datagridview non ha una proprietà DoubleBuffered , ma creando una Classe di Estensione si riesce a creare il metodo anche per la datagridview.

    Lo stesso effetto si sarebbe potuto ottenere creando una classe che deriva da DataGridView e rendendo pubblicamente accessibile la proprietà DoubleBuffered e magari inizializzandola per default.

    Rispetto alla soluzione da te adottata, che comunque è ben incapsulata, avresti potuto “registrare” un nuovo controllo mettendolo in una libreria condivisa che “trascinato” al posto della grid originale, espone automaticamente la funzionalità precedentemente nascosta, e potenzialmente accoglie tutte le possibili integrazioni che in futuro si dovessero rendere necessarie per specializzare il comportamento della griglia, partendo dalle solida fondamenta della DataGridView di .NET.

    E' anche uno dei vantaggi di lavorare con una libreria (WinForms) i cui componenti e controlli - compresi Form e UserControl - sono delle classi, tranquillamente ereditabili grazie alla OOP.

  • Re: Datagridview display molto lento [RISOLTO]

    21/03/2024 - Alka ha scritto:


    Lo stesso effetto si sarebbe potuto ottenere creando una classe che deriva da DataGridView e rendendo pubblicamente accessibile la proprietà DoubleBuffered e magari inizializzandola per default.

    Ciao Alka e grazie ancora per le dritte e info 

    Giusto appunto stamani stavo guardando questo aspetto che hai ben illustrato… e vedovo appunto la possibilità di estendere al controllo Datagriview il doublebuffered passando dal costrutto base() ecc.ecc.

    Il tuo ultimo post mi aiuta a comprendere meglio, in generale, i vantaggi a cui facevi riferimento.

    21/03/2024 - Alka ha scritto:


    E' anche uno dei vantaggi di lavorare con una libreria (WinForms) i cui componenti e controlli - compresi Form e UserControl - sono delle classi, tranquillamente ereditabili grazie alla OOP.

    grazie grazie grazie 

    un saluto e buon lavoro  ;-)

Devi accedere o registrarti per scrivere nel forum
18 risposte