Procedure consigliate per ridimensionare il controllo DataGridView Windows FormBest Practices for Scaling the Windows Forms DataGridView Control

Il DataGridView controllo è progettato per fornire la massima scalabilità.The DataGridView control is designed to provide maximum scalability. Se è necessario visualizzare grandi quantità di dati, è necessario seguire le linee guida descritte in questo argomento per evitare l'utilizzo di grandi quantità di memoria o diminuire la velocità di risposta dell'interfaccia utente (UI).If you need to display large amounts of data, you should follow the guidelines described in this topic to avoid consuming large amounts of memory or degrading the responsiveness of the user interface (UI). In questo argomento vengono illustrati i problemi seguenti:This topic discusses the following issues:

  • Utilizzo efficiente di stili di cellaUsing cell styles efficiently

  • Utilizzo efficiente di menu di scelta rapidaUsing shortcut menus efficiently

  • Utilizzo in modo efficiente il ridimensionamento automaticoUsing automatic resizing efficiently

  • Utilizzando le raccolte di celle, righe e colonne selezionate in modo efficienteUsing the selected cells, rows, and columns collections efficiently

  • Utilizzo di righe condiviseUsing shared rows

  • Impedisce la rimozione della condivisione di righePreventing rows from becoming unshared

Se si dispone delle prestazioni di particolari esigenze, è possibile implementare la modalità virtuale e fornire operazioni di gestione dati.If you have special performance needs, you can implement virtual mode and provide your own data management operations. Per ulteriori informazioni, vedere modalità di visualizzazione di dati nel controllo DataGridView Windows Form.For more information, see Data Display Modes in the Windows Forms DataGridView Control.

Utilizzo efficiente di stili di cellaUsing Cell Styles Efficiently

Ogni cella, riga e colonna può avere le proprie informazioni di stile.Each cell, row, and column can have its own style information. Informazioni di stile vengono archiviate in DataGridViewCellStyle oggetti.Style information is stored in DataGridViewCellStyle objects. La creazione degli oggetti di stile di cella per molti singoli DataGridView elementi possono risultare inefficienti, specialmente quando si lavora con grandi quantità di dati.Creating cell style objects for many individual DataGridView elements can be inefficient, especially when working with large amounts of data. Per evitare un impatto sulle prestazioni, utilizzare le linee guida seguenti:To avoid a performance impact, use the following guidelines:

Utilizzo efficiente di menu di scelta rapidaUsing Shortcut Menus Efficiently

Ogni cella, riga e colonna può avere il proprio menu di scelta rapida.Each cell, row, and column can have its own shortcut menu. Menu di scelta rapida di DataGridView controllo sono rappresentati da ContextMenuStrip controlli.Shortcut menus in the DataGridView control are represented by ContextMenuStrip controls. Come con gli oggetti di stile di cella, la creazione di menu di scelta rapida per molti singoli DataGridView elementi influirà negativamente sulle prestazioni.Just as with cell style objects, creating shortcut menus for many individual DataGridView elements will negatively impact performance. Per evitare questo problema, utilizzare le linee guida seguenti:To avoid this penalty, use the following guidelines:

  • Evitare di creare menu di scelta rapida per le singole celle e righe.Avoid creating shortcut menus for individual cells and rows. Ciò include il modello di riga, viene duplicato e il relativo menu di scelta rapida quando nuove righe vengono aggiunte al controllo.This includes the row template, which is cloned along with its shortcut menu when new rows are added to the control. Per ottenere la massima scalabilità, utilizzare solo del controllo ContextMenuStrip proprietà per specificare un menu di scelta rapida solo per l'intero controllo.For maximum scalability, use only the control's ContextMenuStrip property to specify a single shortcut menu for the entire control.

  • Se sono necessari più menu di scelta rapida per più righe o celle, gestire il CellContextMenuStripNeeded o RowContextMenuStripNeeded eventi.If you require multiple shortcut menus for multiple rows or cells, handle the CellContextMenuStripNeeded or RowContextMenuStripNeeded events. Questi eventi consentono di gestire il menu di scelta rapida manualmente, che consente di ottimizzare le prestazioni.These events let you manage the shortcut menu objects yourself, allowing you to tune performance.

Utilizzo in modo efficiente il ridimensionamento automaticoUsing Automatic Resizing Efficiently

Le righe, colonne e le intestazioni possono essere ridimensionate automaticamente come modifiche del contenuto cella in modo che l'intero contenuto delle celle viene visualizzato senza troncamenti.Rows, columns, and headers can be automatically resized as cell content changes so that the entire contents of cells are displayed without clipping. Modifica delle modalità di ridimensionamento anche possibile ridimensionare righe, colonne e intestazioni.Changing sizing modes can also resize rows, columns, and headers. Per determinare le dimensioni corrette, il DataGridView controllo deve esaminare il valore di ogni cella che è necessario consentirne l'utilizzo.To determine the correct size, the DataGridView control must examine the value of each cell that it must accommodate. Quando si lavora con grandi set di dati, questa analisi può influire negativamente sulle prestazioni del controllo quando si verifica il ridimensionamento automatico.When working with large data sets, this analysis can negatively impact the performance of the control when automatic resizing occurs. Per evitare effetti negativi sulle prestazioni, utilizzare le linee guida seguenti:To avoid performance penalties, use the following guidelines:

Per ulteriori informazioni, vedere opzioni di ridimensionamento nel controllo DataGridView Windows Form.For more information, see Sizing Options in the Windows Forms DataGridView Control.

Utilizzo efficiente di celle, righe e le raccolte di colonneUsing the Selected Cells, Rows, and Columns Collections Efficiently

Il SelectedCells insieme non viene eseguito in modo efficiente con selezioni di grandi dimensioni.The SelectedCells collection does not perform efficiently with large selections. Il SelectedRows e SelectedColumns raccolte anche possono risultare inefficiente, anche se a un livello inferiore perché sono presenti molte righe minore del numero di celle in una tipica DataGridView controllo e molte meno colonne che righe.The SelectedRows and SelectedColumns collections can also be inefficient, although to a lesser degree because there are many fewer rows than cells in a typical DataGridView control, and many fewer columns than rows. Per evitare effetti negativi sulle prestazioni quando si utilizzano queste raccolte, utilizzare le linee guida seguenti:To avoid performance penalties when working with these collections, use the following guidelines:

Uso di righe condivisiUsing Shared Rows

Utilizzo efficiente della memoria viene eseguito nel DataGridView controllo condivisione delle righe.Efficient memory use is achieved in the DataGridView control through shared rows. Le righe condividono le informazioni sul relativo aspetto e comportamento possibile la condivisione delle istanze del DataGridViewRow classe.Rows will share as much information about their appearance and behavior as possible by sharing instances of the DataGridViewRow class.

Mentre la condivisione delle istanze di riga, potrai risparmiare memoria, righe può facilmente essere rimossa.While sharing row instances saves memory, rows can easily become unshared. Ad esempio, ogni volta che un utente interagisce direttamente con una cella, la riga viene rimossa.For example, whenever a user interacts directly with a cell, its row becomes unshared. Poiché non è possibile evitare questo, le linee guida fornite in questo argomento sono utili solo quando si lavora con grandi quantità di dati e solo quando gli utenti interagiscono con una relativamente piccola parte dei dati ogni volta che viene eseguito il programma.Because this cannot be avoided, the guidelines in this topic are useful only when working with very large amounts of data and only when users will interact with a relatively small part of the data each time your program is run.

Una riga non può essere condivisi in un oggetto non associato DataGridView controllare se una delle relative celle contengono valori.A row cannot be shared in an unbound DataGridView control if any of its cells contain values. Quando il DataGridView è associato a un'origine dati esterna o quando si implementa la modalità virtuale e fornire la propria origine dati, i valori di cella vengono archiviati all'esterno del controllo anziché in oggetti cella, consentendo la condivisione delle righe.When the DataGridView control is bound to an external data source or when you implement virtual mode and provide your own data source, the cell values are stored outside the control rather than in cell objects, allowing the rows to be shared.

Un oggetto riga può essere condiviso solo se lo stato di tutte le relative celle, è possibile determinare lo stato della riga e degli stati delle colonne contenenti le celle.A row object can only be shared if the state of all its cells can be determined from the state of the row and the states of the columns containing the cells. Se si modifica lo stato di una cella in modo che non può essere dedotto dallo stato della relativa riga e colonna, la riga non può essere condivisa.If you change the state of a cell so that it can no longer be deduced from the state of its row and column, the row cannot be shared.

Ad esempio, una riga non può essere condivisa in una delle situazioni seguenti:For example, a row cannot be shared in any of the following situations:

In modalità di associazione o la modalità virtuale, è possibile fornire le descrizioni comandi e menu di scelta rapida per le singole celle gestendo il CellToolTipTextNeeded e CellContextMenuStripNeeded eventi.In bound mode or virtual mode, you can provide ToolTips and shortcut menus for individual cells by handling the CellToolTipTextNeeded and CellContextMenuStripNeeded events.

Il DataGridView controllo tenterà automaticamente di utilizzare le righe condivise ogni volta che vengono aggiunte righe di DataGridViewRowCollection.The DataGridView control will automatically attempt to use shared rows whenever rows are added to the DataGridViewRowCollection. Utilizzare le linee guida seguenti per assicurarsi che le righe vengono condivisi:Use the following guidelines to ensure that rows are shared:

Per determinare se una riga è condivisa, utilizzare il DataGridViewRowCollection.SharedRow metodo per recuperare l'oggetto riga e quindi selezionare l'oggetto Index proprietà.To determine whether a row is shared, use the DataGridViewRowCollection.SharedRow method to retrieve the row object, and then check the object's Index property. Righe condivise hanno sempre un Index valore della proprietà di – 1.Shared rows always have an Index property value of –1.

Impedisce la rimozione della condivisione di righePreventing Rows from Becoming Unshared

Righe condivise può essere rimossa in seguito a un'azione utente o di codice.Shared rows can become unshared as a result of code or user action. Per evitare un impatto sulle prestazioni, è necessario evitare che le righe verrà annullata.To avoid a performance impact, you should avoid causing rows to become unshared. Durante lo sviluppo di applicazioni, è possibile gestire il RowUnshared evento per determinare quando le righe diventano non condivise.During application development, you can handle the RowUnshared event to determine when rows become unshared. Ciò è utile quando il debug di problemi di condivisione delle righe.This is useful when debugging row-sharing problems.

Per impedire la rimozione della condivisione di righe, utilizzare le linee guida seguenti:To prevent rows from becoming unshared, use the following guidelines:

  • Evitare l'indicizzazione di Rows raccolta o l'iterazione con un foreach ciclo.Avoid indexing the Rows collection or iterating through it with a foreach loop. In genere non è necessario accedere direttamente alle righe.You will not typically need to access rows directly. DataGridView i metodi che operano sulle righe accettano gli argomenti di indice di riga invece istanze della riga.DataGridView methods that operate on rows take row index arguments rather than row instances. Inoltre, gestori di eventi relativi alle righe ricevono oggetti di argomento dell'evento con le proprietà di riga che è possibile utilizzare per modificare le righe senza che ne venga annullata.Additionally, handlers for row-related events receive event argument objects with row properties that you can use to manipulate rows without causing them to become unshared.

  • Se è necessario accedere a un oggetto riga, utilizzare il DataGridViewRowCollection.SharedRow (metodo) e passare di indice effettivo la riga.If you need to access a row object, use the DataGridViewRowCollection.SharedRow method and pass in the row's actual index. Si noti tuttavia che la modifica di un oggetto riga condivisa recuperato mediante questo metodo modificare tutte le righe che condividono questo oggetto.Note, however, that modifying a shared row object retrieved through this method will modify all the rows that share this object. La riga per nuovi record non è condivisa con altre righe, tuttavia, in modo che non sarà interessata quando si modifica qualsiasi altra riga.The row for new records is not shared with other rows, however, so it will not be affected when you modify any other row. Si noti inoltre che il menu di scelta rapida diversi possono disporre di diverse righe rappresentata da una riga condivisa.Note also that different rows represented by a shared row may have different shortcut menus. Per recuperare il menu di scelta rapida corretto dall'istanza di una riga condivisa, utilizzare il GetContextMenuStrip (metodo) e passare di indice effettivo la riga.To retrieve the correct shortcut menu from a shared row instance, use the GetContextMenuStrip method and pass in the row's actual index. Se si accede della riga condivisa ContextMenuStrip proprietà, invece, verrà utilizzato l'indice di riga condivisa di -1 e non verrà recuperato il menu di scelta rapida corretto.If you access the shared row's ContextMenuStrip property instead, it will use the shared row index of -1 and will not retrieve the correct shortcut menu.

  • Evitare l'indicizzazione di DataGridViewRow.Cells insieme.Avoid indexing the DataGridViewRow.Cells collection. Accesso diretto a una cella provocherà la riga padre e la rimozione della condivisione, creare un'istanza di un nuovo DataGridViewRow.Accessing a cell directly will cause its parent row to become unshared, instantiating a new DataGridViewRow. Gestori di eventi correlati alla cella ricevono oggetti di argomento dell'evento con le proprietà di cella che è possibile utilizzare per modificare le celle senza causare righe venga rimossa.Handlers for cell-related events receive event argument objects with cell properties that you can use to manipulate cells without causing rows to become unshared. È inoltre possibile utilizzare il CurrentCellAddress proprietà per recuperare gli indici di riga e di colonna della cella corrente senza accedere direttamente alla cella.You can also use the CurrentCellAddress property to retrieve the row and column indexes of the current cell without accessing the cell directly.

  • Evitare le modalità di selezione basata sulla cella.Avoid cell-based selection modes. Queste modalità provocano righe non condivise.These modes cause rows to become unshared. Al contrario, impostare il DataGridView.SelectionMode proprietà DataGridViewSelectionMode.FullRowSelect o DataGridViewSelectionMode.FullColumnSelect.Instead, set the DataGridView.SelectionMode property to DataGridViewSelectionMode.FullRowSelect or DataGridViewSelectionMode.FullColumnSelect.

  • Non gestire la DataGridViewRowCollection.CollectionChanged o DataGridView.RowStateChanged eventi.Do not handle the DataGridViewRowCollection.CollectionChanged or DataGridView.RowStateChanged events. Questi eventi provocano righe non condivise.These events cause rows to become unshared. Inoltre, non chiamare il DataGridViewRowCollection.OnCollectionChanged o DataGridView.OnRowStateChanged metodi, la generazione di questi eventi.Also, do not call the DataGridViewRowCollection.OnCollectionChanged or DataGridView.OnRowStateChanged methods, which raise these events.

  • Non accedere il DataGridView.SelectedCells raccolta quando il DataGridView.SelectionMode valore della proprietà è FullColumnSelect, ColumnHeaderSelect, FullRowSelect, o RowHeaderSelect.Do not access the DataGridView.SelectedCells collection when the DataGridView.SelectionMode property value is FullColumnSelect, ColumnHeaderSelect, FullRowSelect, or RowHeaderSelect. In questo modo tutte le righe selezionate verrà annullata.This causes all selected rows to become unshared.

  • Non chiamare il DataGridView.AreAllCellsSelected metodo.Do not call the DataGridView.AreAllCellsSelected method. Questo metodo può causare righe venga rimossa.This method can cause rows to become unshared.

  • Non chiamare il DataGridView.SelectAll metodo quando il DataGridView.SelectionMode valore della proprietà è CellSelect.Do not call the DataGridView.SelectAll method when the DataGridView.SelectionMode property value is CellSelect. In questo modo tutte le righe per la rimozione della condivisione.This causes all rows to become unshared.

  • Non impostare il ReadOnly o Selected proprietà di una cella per false quando è impostata la proprietà corrispondente nella colonna true.Do not set the ReadOnly or Selected property of a cell to false when the corresponding property in its column is set to true. In questo modo tutte le righe per la rimozione della condivisione.This causes all rows to become unshared.

  • Non accedere il DataGridViewRowCollection.List proprietà.Do not access the DataGridViewRowCollection.List property. In questo modo tutte le righe per la rimozione della condivisione.This causes all rows to become unshared.

  • Non chiamare il Sort(IComparer) overload di Sort metodo.Do not call the Sort(IComparer) overload of the Sort method. Ordinamento con un operatore di confronto personalizzato fa sì che tutte le righe per la rimozione della condivisione.Sorting with a custom comparer causes all rows to become unshared.

Vedere ancheSee Also

DataGridView
Ottimizzazione delle prestazioni nel controllo DataGridView di Windows FormPerformance Tuning in the Windows Forms DataGridView Control
Modo virtuale nel controllo DataGridView di Windows FormVirtual Mode in the Windows Forms DataGridView Control
Modalità di visualizzazione di dati nel controllo DataGridView di Windows FormData Display Modes in the Windows Forms DataGridView Control
Stili delle celle nel controllo DataGridView di Windows FormCell Styles in the Windows Forms DataGridView Control
Procedura: Impostare stili di cella predefiniti per il controllo DataGridView di Windows FormHow to: Set Default Cell Styles for the Windows Forms DataGridView Control
Opzioni di ridimensionamento nel controllo DataGridView di Windows FormSizing Options in the Windows Forms DataGridView Control