Procedure consigliate per ridimensionare il controllo DataGridView Windows Form

Il DataGridView controllo è progettato per offrire 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 raccolte di celle, righe e colonne selezionate

  • Uso di righe condivise

  • Impedire l'annullamento della condivisione delle righe

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

Uso efficiente degli stili di cella

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

  • Evitare di impostare le proprietà di stile delle celle per DataGridViewCell singoli oggetti o DataGridViewRow . Include l'oggetto riga specificato dalla RowTemplate proprietà . Ogni nuova riga clonata dal modello di riga riceverà la propria copia dell'oggetto stile di cella del modello. Per ottenere la massima scalabilità, impostare le proprietà di stile delle celle a DataGridView livello. Ad esempio, impostare DataGridView.DefaultCellStyle la proprietà anziché la proprietà DataGridViewCell.Style .

  • Se alcune celle richiedono una formattazione diversa dalla formattazione predefinita, usare la stessa istanza in gruppi di DataGridViewCellStyle celle, righe o colonne. Evitare di impostare direttamente proprietà di DataGridViewCellStyle tipo su singole celle, righe e colonne. Per un esempio di condivisione dello stile di cella, vedere Procedura: Impostare gli stili di cella predefiniti per il controllo DataGridView Windows Form. È anche possibile evitare una penalizzazione delle prestazioni quando si impostano singolarmente gli stili di cella gestendo il CellFormatting gestore dell'evento . Per un esempio, vedere Procedura: Personalizzare la formattazione deidati nel controllo DataGridView Windows Form .

  • Quando si determina lo stile di una cella, usare la DataGridViewCell.InheritedStyle proprietà anziché la proprietà DataGridViewCell.Style . L'accesso alla proprietà crea una nuova istanza della classe se Style la proprietà non è già stata DataGridViewCellStyle usata. Inoltre, questo oggetto potrebbe non contenere le informazioni complete sullo stile per la cella se alcuni stili vengono ereditati dalla riga, dalla colonna o dal controllo. Per altre informazioni sull'ereditarietà dello stile delle celle, vedere Stili di cella nel controllo DataGridView Windows Form.

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 DataGridView nel controllo sono rappresentati da controlli ContextMenuStrip . Come per gli oggetti stile cella, la creazione di menu di scelta rapida per molti singoli DataGridView elementi influisce negativamente sulle prestazioni. Per evitare questa penalità, usare le linee guida seguenti:

  • Evitare di creare menu di scelta rapida per singole celle e righe. Include il modello di riga, clonato insieme al relativo menu di scelta rapida quando vengono aggiunte nuove righe al controllo . Per ottenere la massima scalabilità, usare solo la proprietà del controllo per ContextMenuStrip 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 il contenuto delle celle cambia in modo che l'intero contenuto delle celle venga visualizzato senza ritaglio. La modifica delle modalità di ridimensionamento può anche ridimensionare righe, colonne e intestazioni. Per determinare le dimensioni corrette, il controllo deve esaminare il valore di DataGridView ogni cella che deve contenere. Quando si lavora con set di dati di grandi dimensioni, questa analisi può influire negativamente sulle prestazioni del controllo quando si verifica il ridimensionamento automatico. Per evitare penalizzazioni delle prestazioni, usare le linee guida seguenti:

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

Uso efficiente delle raccolte di celle, righe e colonne selezionate

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

Uso di righe condivise

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

Anche se la condivisione di istanze di riga consente di risparmiare memoria, le righe possono essere facilmente annullate. Ad esempio, ogni volta che un utente interagisce direttamente con una cella, la relativa riga viene annullata. Poiché questo non può essere evitato, 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 se DataGridView una delle relative celle contiene valori. Quando il controllo è associato a un'origine dati esterna o quando si implementa la modalità virtuale e si fornisce la propria origine dati, i valori delle celle vengono archiviati all'esterno del controllo anziché negli oggetti cella, consentendo la condivisione delle DataGridView 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 dedotta 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:

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

Il DataGridView controllo tenterà automaticamente di usare 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, usare 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 di proprietà pari a -1.

Impedisci l'annullamento della condivisione delle righe

Le righe condivise possono essere annullate a causa di 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 RowUnshared l'evento per determinare quando le righe vengono annullate. Ciò è utile quando si esegue il debug di problemi di condivisione delle righe.

Per impedire l'annullamento della condivisione delle righe, usare le linee guida seguenti:

  • Evitare di indicizzare Rows la raccolta o di scorrerla con un ciclo foreach . 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 alle righe ricevono oggetti argomento dell'evento con proprietà di riga che è possibile usare per modificare le righe senza che ne venga annullata 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 verrà influenzata quando si modifica un'altra riga. Si noti inoltre che righe diverse 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 GetContextMenuStrip passare l'indice effettivo della riga. Se invece si accede alla proprietà della riga condivisa, verrà utilizzato l'indice di riga condiviso -1 e non verrà recuperato ContextMenuStrip il menu di scelta rapida corretto.

  • Evitare di indicizzare la DataGridViewRow.Cells raccolta. L'accesso diretto a una cella causerà l'annullamento della 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à di cella che è possibile usare per modificare le celle senza causare l'annullamento della condivisione delle righe. È anche possibile usare la proprietà per recuperare gli indici di riga e colonna della cella corrente senza CurrentCellAddress accedere direttamente alla cella.

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

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

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

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

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

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

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

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

Vedi anche