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, attenersi alle linee guida descritte in questo argomento per evitare l'utilizzo di grandi quantità di memoria o la riduzione della velocità di risposta dell'interfaccia utente (UI). In questo argomento vengono illustrati i problemi seguenti:

  • Uso efficiente degli stili delle celle

  • Utilizzo efficiente di menu di scelta rapida

  • Uso efficiente del ridimensionamento automatico

  • Utilizzo efficiente delle raccolte celle, righe e colonne selezionate

  • Uso di righe condivise

  • Impedire la condivisione delle righe

Se si hanno esigenze di prestazioni particolari, è possibile implementare la modalità virtuale e fornire le proprie operazioni di gestione dei dati. Per altre informazioni, vedere modalità di visualizzazione dati nel controllo DataGridView Windows Forms.

Uso efficiente degli stili delle celle

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

Utilizzo efficiente di 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 da ContextMenuStrip controlli. Così come per gli oggetti di stile cella, la creazione di menu di scelta rapida per molti singoli DataGridView elementi avrà un impatto negativo sulle prestazioni. Per evitare questi rigore, attenersi alle 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 ContextMenuStrip proprietà del 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 RowContextMenuStripNeeded eventi o. Questi eventi consentono di gestire 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 come modifiche al contenuto della cella, in modo che l'intero contenuto delle celle venga visualizzato senza ritaglio. La modifica delle modalità di ridimensionamento può inoltre ridimensionare righe, colonne e intestazioni. Per determinare la dimensione corretta, 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 le penalizzazioni delle prestazioni, attenersi alle linee guida seguenti:

Per ulteriori informazioni, vedere Opzioni di ridimensionamento nel controllo DataGridView Windows Forms.

Utilizzo efficiente delle raccolte celle, righe e colonne selezionate

La SelectedCells raccolta non viene eseguita in modo efficiente con selezioni di grandi dimensioni. Le SelectedRows SelectedColumns raccolte e possono anche essere inefficienti, anche se a un livello inferiore perché sono presenti molte meno righe rispetto alle celle di un DataGridView controllo tipico e molte meno colonne rispetto alle righe. Per evitare le penalizzazioni delle prestazioni durante l'utilizzo di queste raccolte, attenersi alle linee guida seguenti:

Uso di righe condivise

Un utilizzo efficiente della memoria viene effettuato nel DataGridView controllo tramite righe condivise. Le righe condividono quante più informazioni sul loro aspetto e comportamento possibile condividendo le istanze della DataGridViewRow classe.

Durante la condivisione di istanze di riga viene salvata la memoria, le righe possono essere facilmente non condivise. Ad esempio, ogni volta che un utente interagisce direttamente con una cella, viene annullata la condivisione della relativa riga. Poiché questa operazione non può essere evitata, le linee guida 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 relativa riga e colonna, la riga non può essere condivisa.

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

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

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

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

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

Il DataGridView controllo tenterà automaticamente di utilizzare righe condivise ogni volta che vengono aggiunte righe 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, quindi controllare la proprietà dell'oggetto Index . Il Index valore della proprietà delle righe condivise è sempre-1.

Impedire la condivisione delle righe

È possibile annullare la condivisione delle righe condivise in seguito all'azione del codice o dell'utente. Per evitare un effetto sulle prestazioni, è consigliabile evitare che le righe vengano non condivise. Durante lo sviluppo di applicazioni, è possibile gestire l' RowUnshared evento per determinare quando le righe diventano non condivise. Questa operazione è utile durante il debug dei problemi di condivisione delle righe.

Per impedire che le righe diventino non condivise, attenersi alle linee guida seguenti:

  • Evitare l'indicizzazione della Rows raccolta o l'iterazione tramite un foreach ciclo. In genere non è necessario accedere direttamente alle righe. DataGridView i metodi che operano sulle righe accettano argomenti di indice di riga anziché istanze di riga. Inoltre, i gestori per gli eventi correlati alla riga ricevono oggetti argomento dell'evento con proprietà di riga che è possibile usare per modificare le righe senza comportarne la 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 è tuttavia condivisa con altre righe, pertanto non sarà interessata quando si modifica un'altra riga. Si noti inoltre che diverse righe rappresentate da una riga condivisa possono avere diversi menu di scelta rapida. Per recuperare il menu di scelta rapida corretto da un'istanza di riga condivisa, usare il GetContextMenuStrip metodo e passare l'indice effettivo della riga. Se invece si accede alla proprietà della riga condivisa ContextMenuStrip , verrà utilizzato l'indice di riga condiviso di-1 e non verrà recuperato il menu di scelta rapida corretto.

  • Evitare l'indicizzazione della DataGridViewRow.Cells raccolta. Se si accede direttamente a una cella, viene annullata la condivisione della riga padre, creando un'istanza di un nuovo oggetto DataGridViewRow . I gestori per gli eventi correlati alle celle ricevono oggetti argomento dell'evento con proprietà delle celle che è possibile usare per modificare le celle senza causare la condivisione delle righe. È anche possibile usare la CurrentCellAddress proprietà per recuperare gli indici di riga e di colonna della cella corrente senza accedere direttamente alla cella.

  • Evitare le modalità di selezione basate su celle. Queste modalità comportano la non condivisione delle righe. In alternativa, impostare la DataGridView.SelectionMode proprietà su DataGridViewSelectionMode.FullRowSelect o su DataGridViewSelectionMode.FullColumnSelect .

  • Non gestire gli DataGridViewRowCollection.CollectionChanged eventi o DataGridView.RowStateChanged . Questi eventi impediscono la 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 DataGridView.SelectionMode valore della proprietà è FullColumnSelect , ColumnHeaderSelect , FullRowSelect o RowHeaderSelect . In questo modo verrà annullata la condivisione di tutte le righe selezionate.

  • Non chiamare il DataGridView.AreAllCellsSelected metodo. Questo metodo può impedire la condivisione delle righe.

  • Non chiamare il DataGridView.SelectAll metodo quando il DataGridView.SelectionMode valore della proprietà è CellSelect . In questo modo verrà annullata la condivisione di tutte le righe.

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

  • Non accedere alla DataGridViewRowCollection.List Proprietà. In questo modo verrà annullata la condivisione di tutte le righe.

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

Vedere anche