Come creo un DataGridView con *molte* righe?

Guglielmo Cancelli 5 Punti reputazione
2024-04-01T13:01:52.5366667+00:00

Devo creare un Dgv con molte righe, potrebbero essere 10 come 1,2 milioni o più.

Aggiungendo le righe con Add (e SuspendLayout) ottengo errore di memoria per, suppongo, un blocco arbitrario, perchè la RAM non era satura.

Usando una lista o array di DataGridViewRow e usando VirtualMode o va in loop infinito ricorsivo dentro a CellValueNeeded oppure non mostra nulla.

Non ho trovato una guida chiara a DataSource. Considerando che non ho un database ma un elenco che creo da programma.

Una volta che ho la lista/array devo anche nascondere o mostrare gruppi di righe ogni tanto. E devo anche impostare la posizione visualizzata con FirstDisplayedScrollingRowIndex.


Ma sprattutto, perchè deve essere il povero programamtore a trovare una soluzione quando vorrebbe solo creare il suo programma, anzichè gli sviluppatori del Dgv? 🤬

VB
VB
Linguaggio di programmazione orientato agli oggetti sviluppato da Microsoft implementato in .NET Framework. Precedentemente noto come Visual Basic .NET.
18 domande
0 commenti Senza commenti
{count} voti

1 risposta

Ordina per: Più utili
  1. Monica Caprio (Convergys International Europe) 1,130 Punti reputazione Fornitore Microsoft
    2024-04-02T05:59:39.3966667+00:00

    Gentile Guglielmo,

    Per gestire grandi quantità di dati in un DataGridView senza incorrere in problemi di memoria e ottenere prestazioni ottimali, dovresti considerare l'utilizzo di Virtual Mode in combinazione con un'implementazione personalizzata di DataGridView.

    Ecco una guida su come procedere:

    1. Virtual Mode: In Virtual Mode, il DataGridView non memorizza fisicamente tutte le righe di dati, ma le richiede dinamicamente solo quando sono necessarie per essere visualizzate. Questo è particolarmente utile quando si lavora con grandi quantità di dati.
    2. Implementazione Custom di DataGridView: Devo implementare il proprio DataGridView personalizzato estendendo la classe DataGridView e gestendo gli eventi necessari per Virtual Mode.

    Ecco i passaggi principali per implementare Virtual Mode:

    • Impostare DataGridView.VirtualMode su true: Questo abilita la modalità virtuale.
    • Gestire l'evento CellValueNeeded: Questo evento viene chiamato ogni volta che una cella ha bisogno del suo valore. È necessario fornire il valore per la cella specificata in base ai dati sottostanti.
    • Gestire l'evento CellValuePushed (opzionale): Questo evento viene chiamato quando viene modificato il valore di una cella. È necessario gestire questo evento se si vuole supportare l'aggiornamento dei dati nel tuo modello dati sottostante.
    • Gestire l'evento RowCountNeeded (opzionale): Se si sa in anticipo quante righe ci sono nel dataset, è possibile gestire questo evento per restituire il numero totale di righe. In caso contrario, il DataGridView cercherà di determinare il numero di righe in base alle richieste di visualizzazione.
    • Gestire l'evento RowsAdded e RowsRemoved (opzionale): Se si modifica dinamicamente il dataset sottostante, è possibile gestire questi eventi per aggiornare il DataGridView di conseguenza.
    • Impostare la posizione visualizzata con FirstDisplayedScrollingRowIndex: È possibile utilizzare questa proprietà per impostare la riga che deve essere visualizzata in primo piano.

    Ecco un esempio di implementazione di base:

    
    public class CustomDataGridView : DataGridView
    
    {
    
        public CustomDataGridView()
    
        {
    
            // Abilita la modalità virtuale
    
            this.VirtualMode = true;
    
        }
    
        protected override void OnCellValueNeeded(DataGridViewCellValueEventArgs e)
    
        {
    
            // Fornisci il valore per la cella specificata in base ai dati sottostanti
    
            // Supponiamo che i dati siano contenuti in una lista di oggetti 'DataObject'
    
            if (e.RowIndex >= 0 && e.RowIndex < DataObjects.Count)
    
            {
    
                var dataObject = DataObjects[e.RowIndex];
    
                // Assume che le colonne siano numerate e correlate agli oggetti DataObject
    
                switch (e.ColumnIndex)
    
                {
    
                    case 0:
    
                        e.Value = dataObject.Property1;
    
                        break;
    
                    case 1:
    
                        e.Value = dataObject.Property2;
    
                        break;
    
                    // Gestire altre colonne se necessario
    
                }
    
            }
    
        }
    
    }
    
    

    In questo esempio, DataObjects è una lista di oggetti che rappresentano i dati che si desidera visualizzare nel DataGridView. È necessario adattare questa implementazione in base alla struttura dei tuoi dati.

    Ricorda di gestire gli eventi necessari e personalizzare ulteriormente la tua implementazione in base alle tue esigenze specifiche.

    Spero di esserti stata utile.

    Monica.

    0 commenti Senza commenti

Risposta

Le risposte possono essere contrassegnate come accettate dall'autore della domanda, il che aiuta gli utenti a sapere che hanno risolto il problema dell'autore.