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.
Evitare di impostare le proprietà dello stile di cella per singoli oggetti DataGridViewCell o DataGridViewRow. Questa condizione vale anche per l'oggetto riga specificato dalla proprietà RowTemplate. Ciascuna nuova riga duplicata dal modello di riga riceverà una copia dello stile di cella del modello. Per ottenere la massima scalabilità, impostare le proprietà dello stile di cella a livello del controllo DataGridView. Ad esempio, impostare la proprietà DataGridView.DefaultCellStyle invece della proprietà DataGridViewCell.Style.
Se per alcune celle è necessaria una formattazione diversa da quella predefinita, utilizzare la stessa istanza della proprietà DataGridViewCellStyle in gruppi diversi di celle, righe o colonne. Evitare di impostare direttamente proprietà di tipo DataGridViewCellStyle su singole celle, righe e colonne. Per un esempio di condivisione degli stili di cella, vedere Procedura: impostare stili di cella predefiniti per il controllo DataGridView di Windows Form. Mediante il gestore eventi CellFormatting è anche possibile evitare la riduzione delle prestazioni durante l'impostazione dei singoli stili di cella. Per un esempio, vedere Procedura: formattare dati personalizzati in un controllo DataGridView di Windows Form.
Quando si determina uno stile di cella, utilizzare la proprietà DataGridViewCell.InheritedStyle invece della proprietà DataGridViewCell.Style. L'accesso alla proprietà Style determina la creazione di una nuova istanza della classe DataGridViewCellStyle se la proprietà non è stata ancora utilizzata. Se alcuni stili sono ereditati dalla riga, dalla colonna o dal controllo, l'accesso all'oggetto potrebbe non contenere le informazioni sullo stile complete relative alla cella. Per ulteriori informazioni sull'ereditarietà degli stili delle celle, vedere Stili della cella nel controllo DataGridView Windows Form.
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.
Evitare di utilizzare il ridimensionamento su un controllo DataGridView con un insieme ampio di righe. Se si utilizza il ridimensionamento automatico, ridimensionare solo le righe visualizzate. Utilizzare solo le righe visualizzate anche in modalità virtuale.
Per righe e colonne, utilizzare il campo DisplayedCells o il campo DisplayedCellsExceptHeaders delle enumerazioni DataGridViewAutoSizeRowsMode, DataGridViewAutoSizeColumnsMode e DataGridViewAutoSizeColumnMode.
Per le intestazioni di riga, utilizzare il campo AutoSizeToDisplayedHeaders o il campo AutoSizeToFirstHeader dell'enumerazione DataGridViewRowHeadersWidthSizeMode.
Per ottenere la massima scalabilità, disattivare il ridimensionamento automatico e utilizzare il ridimensionamento a livello di codice.
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.
Per determinare se tutte le celle presenti in un controllo DataGridView sono state selezionate prima dell'accesso al contenuto dell'insieme SelectedCells, verificare il valore restituito del metodo AreAllCellsSelected. Notare, tuttavia, che questo metodo può provocare la rimozione della condivisione delle righe. Per ulteriori informazioni, vedere la sezione successiva.
Evitare di utilizzare la proprietà Count della classe System.Windows.Forms.DataGridViewSelectedCellCollection per determinare il numero delle celle selezionate. Utilizzare invece il metodo DataGridView.GetCellCount e passare il valore DataGridViewElementStates.Selected. Analogamente, utilizzare i metodi DataGridViewRowCollection.GetRowCount e DataGridViewColumnCollection.GetColumnCount per determinare il numero di elementi selezionati invece di accedere agli insiemi di righe e colonne selezionati.
Evitare le modalità di selezione basate sulle celle. Impostare invece la proprietà DataGridView.SelectionMode su DataGridViewSelectionMode.FullRowSelect o DataGridViewSelectionMode.FullColumnSelect.
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:
Evitare di chiamare l'overload Add(Object[]) del metodo Add e l'overload Insert(Object[]) del metodo Insert dell'insieme DataGridView.Rows. Questi overload creano automaticamente righe non condivise.
Verificare che la riga specificata nella proprietà DataGridView.RowTemplate possa essere condivisa nei seguenti casi:
Quando viene chiamato l'overload Add() o l'overload Add(Int32) del metodo Add oppure l'overload Insert(Int32,Int32) del metodo Insert dell'insieme DataGridView.Rows.
Quando viene incrementato il valore della proprietà DataGridView.RowCount.
Quando viene impostata la proprietà DataGridView.DataSource.
Verificare che la riga indicata dal parametro indexSource possa essere condivisa quando vengono chiamati i metodi AddCopy, AddCopies, InsertCopy e InsertCopies dell'insieme DataGridView.Rows.
Verificare che la riga o le righe specificate possano essere condivise quando si chiama l'overload Add(DataGridViewRow) del metodo Add, il metodo AddRange, l'overload Insert(Int32,DataGridViewRow) del metodo Insert e il metodo InsertRange dell'insieme DataGridView.Rows.
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
Altre risorse
Ottimizzazione delle prestazioni nel controllo DataGridView Windows Form