Condividi tramite


Procedure consigliate per ridimensionare il controllo DataGridView Windows Form

Aggiornamento: novembre 2007

Il controllo DataGridView è progettato per fornire la massima scalabilità. Se è necessario visualizzare grandi quantità di dati, seguire le istruzioni riportate in questo argomento per evitare l'utilizzo di notevoli quantità di memoria o diminuire i tempi di risposta dell'interfaccia utente. In questo argomento vengono illustrati i seguenti problemi:

  • Utilizzo efficace degli stili di cella

  • Utilizzo efficace dei menu di scelta rapida

  • Utilizzo efficace del ridimensionamento automatico

  • Utilizzo efficace di insiemi di celle, righe e colonne selezionati

  • Utilizzo di righe condivise

  • Come impedire la rimozione della condivisione delle righe

Se è necessario ottenere prestazioni speciali, è possibile implementare la modalità virtuale ed eseguire operazioni di gestione dei dati personalizzati. Per ulteriori informazioni, vedere Modalità di visualizzazione dati nel controllo DataGridView di Windows Form.

Utilizzo efficace degli stili di cella

A ciascuna cella, riga e colonna sono associate informazioni di stile. Le informazioni di stile vengono memorizzate negli oggetti DataGridViewCellStyle. La creazione di oggetti cella per molti singoli elementi del controllo -DataGridView può risultare inefficace, specie quando si utilizzano grandi quantità di dati. Per evitare l'impatto sulle prestazioni, attenersi alle istruzioni riportate di seguito.

Utilizzo efficace dei menu di scelta rapida

A ciascuna cella, riga e colonna è associato un menu di scelta rapida. I menu di scelta rapida nel controllo DataGridView sono rappresentati dai controlli ContextMenuStrip. Come nel caso degli stili di cella, la creazione di menu di scelta rapida per molti singoli elementi DataGridView ha un impatto negativo sulle prestazioni. Per evitare questo problema, attenersi alle istruzioni riportate di seguito.

  • Evitare di creare menu di scelta rapida per singole celle e righe. Questa condizione vale anche per il modello di riga duplicato assieme al menu di scelta rapida quando nuove righe vengono aggiunte al controllo. Per ottenere la massima scalabilità, utilizzare solo la proprietà ContextMenuStrip 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 l'evento CellContextMenuStripNeeded o l'evento RowContextMenuStripNeeded. Questi eventi consentono di gestire i menu di scelta rapida manualmente, consentendo di regolare le prestazioni.

Utilizzo efficace del ridimensionamento automatico

Righe, colonne e intestazioni possono essere ridimensionate automaticamente quando il contenuto della cella viene modificato, in modo da visualizzare l'intero contenuto delle celle senza che vengano eseguiti tagli. Le modalità di modifica delle dimensioni possono comportare anche il ridimensionamento di righe, colonne e intestazioni. Per determinare le dimensioni corrette, il controllo DataGridView deve esaminare il valore di ciascuna cella nella quale dovrà essere disposto il contenuto. Se si lavora con grandi quantità di dati, questa analisi può avere un effetto negativo sulle prestazioni del controllo quando si verifica il ridimensionamento automatico. Per evitare questo problema di prestazioni, attenersi alle istruzioni riportate di seguito.

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

Utilizzo efficace di insiemi di celle, righe e colonne selezionati

L'insieme SelectedCells non viene eseguito in modo efficace in presenza di selezioni di notevoli dimensioni. Anche gli insiemi SelectedRows e SelectedColumns possono risultare inefficaci, sebbene in maniera minore, in quanto in un controllo DataGridView normale vi sono molte meno righe che celle e molte meno colonne che righe. Per evitare la riduzione delle prestazioni quando si utilizzano questi insiemi, attenersi alle istruzioni riportate di seguito.

Utilizzo di righe condivise

La condivisione delle righe consente di sfruttare in modo efficace la memoria nel controllo DataGridView. La condivisione delle istanze della classe DataGridViewRow determina la condivisione nelle righe di tutte le informazioni possibili sul relativo aspetto e comportamento.

La condivisione delle istanze della riga consente di utilizzare una quantità minore di memoria, ma la condivisione delle righe può essere facilmente rimossa. Ad esempio, ogni volta che un utente interagisce direttamente con una cella, la condivisione della relativa riga viene rimossa. Poiché non è possibile evitare questa condizione, le istruzioni riportate in questo argomento sono utili solo quando si utilizzano quantità di dati molto grandi e solo quando gli utenti interagiscono con una parte relativamente piccola dei dati ogni volta che il programma viene eseguito.

Non è possibile condividere una riga in un controllo DataGridView non associato se in una delle celle sono presenti valori. Quando il controllo DataGridView viene associato a un'origine dati esterna o quando si implementa la modalità virtuale e si fornisce un'origine dati personalizzata, i valori della cella vengono memorizzati al di fuori del controllo invece che negli oggetti cella, consentendo la condivisione delle righe.

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

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

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

  • La riga contiene una cella in cui è impostata la proprietà ToolTipText o la proprietà ContextMenuStrip.

  • La riga contiene una proprietà DataGridViewComboBoxCell in cui è impostata la proprietà Items.

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

Il controllo DataGridView tenta automaticamente di utilizzare le righe condivise ogni volta che vengono aggiunte righe alla classe DataGridViewRowCollection. Attenersi alle seguenti istruzioni per verificare che le righe siano condivise:

Per determinare se una riga è condivisa, utilizzare il metodo DataGridViewRowCollection.SharedRow per recuperare l'oggetto riga, quindi verificare la proprietà Index dell'oggetto. Il valore della proprietà Index delle righe condivise è sempre uguale a -1.

Come impedire la rimozione della condivisione delle righe

La condivisione delle righe può essere rimossa a seguito dell'utilizzo di codice o di un'operazione di un utente. Per evitare effetti negativi sulle prestazioni, è necessario evitare che la condivisione delle righe venga rimossa. Durante lo sviluppo dell'applicazione, è possibile gestire l'evento RowUnshared per individuare il momento in cui la condivisione delle righe viene rimossa. Questa operazione è utile durante il debug dei problemi di condivisione delle righe.

Per impedire la rimozione della condivisione delle righe, attenersi alle istruzioni riportate di seguito.

  • Non indicizzare l'insieme Rows o scorrerne gli elementi mediante un ciclo foreach. In genere, non è necessario accedere direttamente alle righe. I metodi DataGridView che operano sulle righe estraggono gli argomenti di indice della riga invece delle istanze di riga. Inoltre, i gestori degli eventi collegati alle righe ricevono oggetti di argomento dell'evento con proprietà delle righe che è possibile utilizzare per modificare le righe senza che ne venga rimossa la condivisione.

  • Se è necessario accedere a una riga, utilizzare il metodo DataGridViewRowCollection.SharedRow e passare il valore di indice reale della riga. La modifica di un oggetto riga condivisa recuperata mediante questo metodo sarà estesa tuttavia a tutte le righe che condividono l'oggetto. Ad ogni modo, la riga relativa ai nuovi record non viene condivisa con le altre righe, per cui la modifica di altre righe non ha effetto su tale riga. Inoltre, righe diverse rappresentate da una riga condivisa possono disporre di menu di scelta rapida diversi. Per recuperare il menu di scelta rapida corretto dall'istanza di una riga condivisa, utilizzare il metodo GetContextMenuStrip e passare il valore di indice reale della riga. Se invece si accede alla proprietà ContextMenuStrip della riga condivisa, verrà utilizzato il valore di indice della riga condivisa di -1 e non verrà recuperato il menu di scelta rapida corretto.

  • Evitare di indicizzare l'insieme DataGridViewRow.Cells. L'accesso diretto a una cella provocherà la rimozione della condivisione della riga padre e determinerà la creazione di una nuova istanza della classe DataGridViewRow. I gestori degli eventi collegati alle celle ricevono oggetti di argomento dell'evento con proprietà delle celle che è possibile utilizzare per modificare le celle senza che venga rimossa la condivisione delle righe. È anche possibile utilizzare la proprietà CurrentCellAddress per recuperare i valori di indice della riga e della colonna della cella corrente senza accedere direttamente alla cella.

  • Evitare le modalità di selezione basate sulle celle. Queste modalità provocano la rimozione della condivisione delle righe. Impostare invece la proprietà DataGridView.SelectionMode su DataGridViewSelectionMode.FullRowSelect o DataGridViewSelectionMode.FullColumnSelect.

  • Non gestire l'evento DataGridViewRowCollection.CollectionChanged o l'evento DataGridView.RowStateChanged. Questi eventi provocano la rimozione della condivisione delle righe. Inoltre, non chiamare il metodo DataGridViewRowCollection.OnCollectionChanged o il metodo DataGridView.OnRowStateChanged per la generazione di questi eventi.

  • Non accedere all'insieme DataGridView.SelectedCells quando il valore della proprietà DataGridView.SelectionMode è FullColumnSelect, ColumnHeaderSelect, FullRowSelect o RowHeaderSelect. In questo modo viene rimossa la condivisione di tutte le righe selezionate.

  • Non chiamare il metodo DataGridView.AreAllCellsSelected. Questo metodo può provocare la rimozione della condivisione di tutte le righe.

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

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

  • Non accedere alla proprietà DataGridViewRowCollection.List. In questo modo viene rimossa la condivisione di tutte le righe.

  • Non chiamare l'overload Sort(IComparer) del metodo Sort. L'ordinamento eseguito mediante operatori di confronto personalizzati provoca la rimozione della condivisione di tutte le righe.

Vedere anche

Attività

Procedura: impostare stili di cella predefiniti per il controllo DataGridView di Windows Form

Concetti

Modo virtuale nel controllo DataGridView di Windows Form

Modalità di visualizzazione dati nel controllo DataGridView di Windows Form

Stili della cella nel controllo DataGridView Windows Form

Opzioni di ridimensionamento nel controllo DataGridView Windows Form

Riferimenti

DataGridView

Altre risorse

Ottimizzazione delle prestazioni nel controllo DataGridView Windows Form