Procedure consigliate per ridimensionare il controllo DataGridView Windows Form

Il DataGridView controllo è progettato per garantire la massima scalabilità. Se è necessario visualizzare grandi quantità di dati, è necessario seguire le linee guida descritte in questo argomento per evitare di utilizzare grandi quantità di memoria o ridurre la velocità di risposta dell'interfaccia utente. In questo argomento vengono illustrati i problemi seguenti:

  • Uso efficiente degli stili di cella

  • Uso efficiente dei menu di scelta rapida

  • Uso efficiente del ridimensionamento automatico

  • Uso efficiente delle celle, delle righe e delle colonne selezionate

  • Uso di righe condivise

  • Impedire la condivisione delle righe

Se si hanno esigenze di prestazioni speciali, è possibile implementare la modalità virtuale e fornire operazioni di gestione dei dati personalizzate. Per altre informazioni, vedere Modalità di visualizzazione dei dati nel controllo DataGridView Windows Form.

Uso efficiente degli stili delle celle

Ogni cella, riga e colonna può avere le proprie informazioni di stile. Le informazioni sullo stile vengono archiviate negli DataGridViewCellStyle oggetti . La creazione di oggetti di stile cella per molti singoli DataGridView elementi può risultare inefficiente, soprattutto quando si lavora con grandi quantità di dati. Per evitare un impatto sulle prestazioni, usare le linee guida seguenti:

Uso efficiente dei menu di scelta rapida

Ogni cella, riga e colonna può avere un proprio menu di scelta rapida. I menu di scelta rapida nel DataGridView controllo sono rappresentati dai ContextMenuStrip controlli. Come per gli oggetti di stile cella, la creazione di menu di scelta rapida per molti singoli DataGridView elementi influirà negativamente sulle prestazioni. Per evitare questa penalità, usare le linee guida seguenti:

  • Evitare di creare menu di scelta rapida per singole celle e righe. Questo include il modello di riga, che viene clonato insieme al relativo menu di scelta rapida quando vengono aggiunte nuove righe al controllo. Per la massima scalabilità, utilizzare solo la proprietà del ContextMenuStrip controllo per specificare un singolo menu di scelta rapida per l'intero controllo.

  • Se sono necessari più menu di scelta rapida per più righe o celle, gestire gli CellContextMenuStripNeeded eventi o RowContextMenuStripNeeded . Questi eventi consentono di gestire manualmente gli oggetti del menu di scelta rapida, consentendo di ottimizzare le prestazioni.

Uso efficiente del ridimensionamento automatico

Le righe, le colonne e le intestazioni possono essere ridimensionate automaticamente quando cambia il contenuto delle celle in modo che l'intero contenuto delle celle venga visualizzato senza ritagliare. La modifica delle modalità di ridimensionamento può anche ridimensionare righe, colonne e intestazioni. Per determinare le dimensioni corrette, il DataGridView controllo deve esaminare il valore di ogni cella che deve contenere. Quando si utilizzano set di dati di grandi dimensioni, questa analisi può influire negativamente sulle prestazioni del controllo quando si verifica il ridimensionamento automatico. Per evitare sanzioni sulle prestazioni, usare le linee guida seguenti:

Per altre informazioni, vedere Opzioni di ridimensionamento nel controllo DataGridView Windows Form.

Utilizzo efficiente delle celle, delle righe e delle colonne selezionate

La SelectedCells raccolta non viene eseguita in modo efficiente con selezioni di grandi dimensioni. Le SelectedRows raccolte e SelectedColumns possono anche risultare inefficienti, anche se in misura minore, perché sono presenti molte meno righe rispetto alle celle in un controllo tipico DataGridView e molte meno colonne rispetto alle righe. Per evitare sanzioni sulle prestazioni quando si usano queste raccolte, usare le linee guida seguenti:

Uso di righe condivise

L'uso efficiente della DataGridView memoria viene ottenuto nel controllo tramite righe condivise. Le righe condivideranno il maggior numero possibile di informazioni sull'aspetto e sul comportamento condividendo le istanze della DataGridViewRow classe .

Durante la condivisione delle istanze di riga, le righe possono diventare facilmente non condivise. Ad esempio, ogni volta che un utente interagisce direttamente con una cella, la relativa riga viene annullata. Poiché ciò non può essere evitato, le linee guida contenute in questo argomento sono utili solo quando si lavora con grandi quantità di dati e solo quando gli utenti interagiranno con una parte relativamente piccola dei dati ogni volta che viene eseguito il programma.

Una riga non può essere condivisa in un controllo non associato DataGridView se una delle relative celle contiene valori. Quando il DataGridView controllo è associato a un'origine dati esterna o quando si implementa la modalità virtuale e si fornisce un'origine dati personalizzata, i valori delle celle vengono archiviati all'esterno del controllo anziché negli oggetti cella, consentendo la condivisione delle righe.

Un oggetto riga può essere condiviso solo se lo stato di tutte le relative celle può essere determinato dallo stato della riga e dagli stati delle colonne contenenti le celle. Se si modifica lo stato di una cella in modo che non possa più essere dedotto dallo stato della riga e della colonna, la riga non può essere condivisa.

Ad esempio, una riga non può essere condivisa in una delle situazioni seguenti:

  • La riga contiene una singola cella selezionata che non si trova in una colonna selezionata.

  • La riga contiene una cella con le relative ToolTipText proprietà o ContextMenuStrip impostate.

  • La riga contiene un oggetto DataGridViewComboBoxCell con il relativo Items set di proprietà.

In modalità associata o in modalità virtuale, è possibile fornire strumenti Suggerimenti e menu di scelta rapida per singole celle gestendo gli CellToolTipTextNeeded eventi e CellContextMenuStripNeeded .

Il DataGridView controllo tenterà automaticamente di utilizzare righe condivise ogni volta che le righe vengono aggiunte a DataGridViewRowCollection. Usare le linee guida seguenti per assicurarsi che le righe siano condivise:

Per determinare se una riga è condivisa, utilizzare il DataGridViewRowCollection.SharedRow metodo per recuperare l'oggetto riga e quindi controllare la proprietà dell'oggetto Index . Le righe condivise hanno sempre un Index valore della proprietà pari a –1.

Impedire che le righe diventino non condivise

Le righe condivise possono diventare non condivise in seguito a codice o azione dell'utente. Per evitare un impatto sulle prestazioni, è consigliabile evitare di annullare la condivisione delle righe. Durante lo sviluppo di applicazioni, è possibile gestire l'evento RowUnshared per determinare quando le righe diventano non condivise. Ciò è utile durante il debug dei problemi di condivisione delle righe.

Per evitare che le righe vengano annullate, usare le linee guida seguenti:

  • Evitare di indicizzare la raccolta o di scorrere l'insieme Rows con un foreach ciclo. In genere non sarà necessario accedere direttamente alle righe. DataGridView metodi che operano su righe accettano argomenti di indice di riga anziché istanze di riga. Inoltre, i gestori per gli eventi correlati alle righe ricevono oggetti argomento evento con proprietà di riga che è possibile usare per modificare le righe senza causarne la mancata condivisione.

  • Se è necessario accedere a un oggetto riga, usare il DataGridViewRowCollection.SharedRow metodo e passare l'indice effettivo della riga. Si noti, tuttavia, che la modifica di un oggetto riga condiviso recuperato tramite questo metodo modificherà tutte le righe che condividono questo oggetto. La riga per i nuovi record non viene tuttavia condivisa con altre righe, pertanto non verrà interessata quando si modifica un'altra riga. Si noti anche che le diverse righe rappresentate da una riga condivisa possono avere menu di scelta rapida diversi. Per recuperare il menu di scelta rapida corretto da un'istanza di riga condivisa, usare il metodo e passare l'indice GetContextMenuStrip effettivo della riga. Se si accede alla proprietà della ContextMenuStrip riga condivisa, verrà invece utilizzato l'indice di riga condiviso -1 e non verrà recuperato il menu di scelta rapida corretto.

  • Evitare di indicizzare la DataGridViewRow.Cells raccolta. L'accesso diretto a una cella causerà la mancata condivisione della riga padre, creando un'istanza di un nuovo DataGridViewRowoggetto . I gestori per gli eventi correlati alle celle ricevono oggetti argomento evento con proprietà di cella che è possibile usare per modificare le celle senza causare la mancata condivisione delle righe. È anche possibile utilizzare la CurrentCellAddress proprietà per recuperare gli indici di riga e colonna della cella corrente senza accedere direttamente alla cella.

  • Evitare le modalità di selezione basate su celle. Queste modalità causano l'annullamento della condivisione delle righe. Impostare invece la DataGridView.SelectionMode proprietà su DataGridViewSelectionMode.FullRowSelect o DataGridViewSelectionMode.FullColumnSelect.

  • Non gestire gli DataGridViewRowCollection.CollectionChanged eventi o DataGridView.RowStateChanged . Questi eventi causano l'annullamento della condivisione delle righe. Inoltre, non chiamare i DataGridViewRowCollection.OnCollectionChanged metodi o DataGridView.OnRowStateChanged che generano questi eventi.

  • Non accedere alla DataGridView.SelectedCells raccolta quando il valore della DataGridView.SelectionMode proprietà è FullColumnSelect, ColumnHeaderSelect, FullRowSelecto RowHeaderSelect. In questo modo tutte le righe selezionate verranno annullate.

  • Non chiamare il DataGridView.AreAllCellsSelected metodo . Questo metodo può causare l'annullamento della condivisione delle righe.

  • Non chiamare il metodo quando il DataGridView.SelectAll valore della DataGridView.SelectionMode proprietà è CellSelect. In questo modo tutte le righe vengono annullate.

  • Non impostare la ReadOnly proprietà o Selected di una cella su false quando la proprietà corrispondente nella colonna è impostata su true. In questo modo tutte le righe vengono annullate.

  • Non accedere alla DataGridViewRowCollection.List proprietà . In questo modo tutte le righe vengono annullate.

  • Non chiamare l'overload Sort(IComparer) del Sort metodo . L'ordinamento con un operatore di confronto personalizzato causa la mancata condivisione di tutte le righe.

Vedi anche