Procedimientos recomendados para ajustar la escala del control DataGridView en formularios Windows FormsBest Practices for Scaling the Windows Forms DataGridView Control

El DataGridView control está diseñado para proporcionar la máxima escalabilidad.The DataGridView control is designed to provide maximum scalability. Si necesita mostrar grandes cantidades de datos, debe seguir las directrices descritas en este tema para evitar consumir grandes cantidades de memoria o degradar la capacidad de respuesta de la interfaz de usuario (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). En este tema se trata los siguientes problemas:This topic discusses the following issues:

  • Usar de forma eficaz los estilos de celdaUsing cell styles efficiently

  • Usar los menús contextuales de forma eficazUsing shortcut menus efficiently

  • Uso de cambio de tamaño automático eficazmenteUsing automatic resizing efficiently

  • Usar las recopilaciones de celdas, filas y columnas seleccionadas de forma eficazUsing the selected cells, rows, and columns collections efficiently

  • Uso de las filas compartidasUsing shared rows

  • Impedir que las filas dejen de estar compartidasPreventing rows from becoming unshared

Si tiene necesidades especiales de rendimiento, puede implementar el modo virtual y proporcionar sus propias operaciones de administración de datos.If you have special performance needs, you can implement virtual mode and provide your own data management operations. Para obtener más información, consulte modos de presentación de datos en el DataGridView Control de Windows Forms.For more information, see Data Display Modes in the Windows Forms DataGridView Control.

Usar de forma eficaz los estilos de celdaUsing Cell Styles Efficiently

Cada celda, fila y columna pueden tener su propia información de estilo.Each cell, row, and column can have its own style information. Información de estilo se almacena en DataGridViewCellStyle objetos.Style information is stored in DataGridViewCellStyle objects. Crear objetos de estilo de celda para muchos individuo DataGridView elementos pueden ser ineficaces, especialmente cuando se trabaja con grandes cantidades de datos.Creating cell style objects for many individual DataGridView elements can be inefficient, especially when working with large amounts of data. Para evitar un impacto en el rendimiento, utilice las siguientes directrices:To avoid a performance impact, use the following guidelines:

Usar los menús contextuales de forma eficazUsing Shortcut Menus Efficiently

Cada celda, fila y columna pueden tener su propio menú contextual.Each cell, row, and column can have its own shortcut menu. Menús contextuales en el DataGridView control se representan mediante ContextMenuStrip controles.Shortcut menus in the DataGridView control are represented by ContextMenuStrip controls. Al igual que con los objetos de estilo de celda, crear menús contextuales para muchos individuo DataGridView elementos afectará negativamente al rendimiento.Just as with cell style objects, creating shortcut menus for many individual DataGridView elements will negatively impact performance. Para evitar esta situación, utilice las siguientes directrices:To avoid this penalty, use the following guidelines:

  • Evite crear menús contextuales para celdas y filas individuales.Avoid creating shortcut menus for individual cells and rows. Esto incluye la plantilla de fila, que se clona junto con su menú contextual cuando se agregan nuevas filas al control.This includes the row template, which is cloned along with its shortcut menu when new rows are added to the control. Para conseguir la máxima escalabilidad, utilice sólo del control ContextMenuStrip propiedad para especificar un solo menú contextual para el control completo.For maximum scalability, use only the control's ContextMenuStrip property to specify a single shortcut menu for the entire control.

  • Si necesita varios menús contextuales para varias filas o celdas, controlar la CellContextMenuStripNeeded o RowContextMenuStripNeeded eventos.If you require multiple shortcut menus for multiple rows or cells, handle the CellContextMenuStripNeeded or RowContextMenuStripNeeded events. Estos eventos le permiten administrar los objetos de menú contextual usted mismo, lo que le permite optimizar el rendimiento.These events let you manage the shortcut menu objects yourself, allowing you to tune performance.

Uso de cambio de tamaño automático eficazmenteUsing Automatic Resizing Efficiently

Encabezados, columnas y filas pueden cambiarse automáticamente como los cambios de contenido de celda para que todo el contenido de las celdas se muestra sin recortes.Rows, columns, and headers can be automatically resized as cell content changes so that the entire contents of cells are displayed without clipping. Cambiar los modos de ajuste de tamaño puede también cambiar el tamaño de filas, columnas y encabezados.Changing sizing modes can also resize rows, columns, and headers. Para determinar el tamaño correcto, el DataGridView control debe examinar el valor de cada celda que se deben dar cabida a.To determine the correct size, the DataGridView control must examine the value of each cell that it must accommodate. Cuando se trabaja con grandes conjuntos de datos, este análisis pueden afecte negativamente el rendimiento del control cuando se produce de cambio de tamaño automático.When working with large data sets, this analysis can negatively impact the performance of the control when automatic resizing occurs. Para evitar las penalizaciones de rendimiento, utilice las siguientes directrices:To avoid performance penalties, use the following guidelines:

Para obtener más información, consulte opciones de ajuste de tamaño en el DataGridView Control de formularios de Windows.For more information, see Sizing Options in the Windows Forms DataGridView Control.

Usar de forma eficaz las celdas seleccionadas, filas y las colecciones de columnasUsing the Selected Cells, Rows, and Columns Collections Efficiently

El SelectedCells colección no se ejecuta eficazmente con grandes selecciones.The SelectedCells collection does not perform efficiently with large selections. El SelectedRows y SelectedColumns colecciones también pueden resultar ineficaces, aunque en menor grado porque hay muchas menos filas que las celdas de una típica DataGridView control y muchas menos columnas de filas.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. Para evitar las penalizaciones de rendimiento cuando se trabaja con estas colecciones, use las siguientes directrices:To avoid performance penalties when working with these collections, use the following guidelines:

Uso compartido de filasUsing Shared Rows

Uso eficaz de la memoria se logra en el DataGridView control a través de las filas compartidas.Efficient memory use is achieved in the DataGridView control through shared rows. Las filas compartirán toda la información sobre su apariencia y comportamiento como sea posible mediante el uso compartido de las instancias de la DataGridViewRow clase.Rows will share as much information about their appearance and behavior as possible by sharing instances of the DataGridViewRow class.

Aunque compartir instancias de fila ahorra memoria, las filas pueden estar compartidas fácilmente.While sharing row instances saves memory, rows can easily become unshared. Por ejemplo, cada vez que un usuario interactúa directamente con una celda, su fila deja de estar compartida.For example, whenever a user interacts directly with a cell, its row becomes unshared. Dado que esto no se puede evitar, las directrices descritas en este tema son útiles solo cuando se trabaja con grandes cantidades de datos y solo cuando los usuarios interactúan con una parte relativamente pequeña de los datos cada vez que se ejecuta el programa.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.

No se puede compartir una fila en una independiente DataGridView controlar si cualquiera de sus celdas contienen valores.A row cannot be shared in an unbound DataGridView control if any of its cells contain values. Cuando el DataGridView está enlazado a un origen de datos externos o al implementar el modo virtual y proporcionar su propio origen de datos, los valores de celda se almacenan fuera del control, en lugar de en los objetos cell, lo que permite a las filas que se va a compartirse.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.

Solo se puede compartir un objeto de fila si se puede determinar el estado de todas sus celdas desde el estado de la fila y los Estados de las columnas que contienen las celdas.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. Si cambia el estado de una celda para que ya no se puede deducir del estado de su fila y columna, no se puede compartir la fila.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.

Por ejemplo, una fila no se puede compartir en cualquiera de las situaciones siguientes:For example, a row cannot be shared in any of the following situations:

En el modo de enlace o en modo virtual, puede proporcionar información sobre herramientas y menús contextuales para celdas individuales controlando el CellToolTipTextNeeded y CellContextMenuStripNeeded eventos.In bound mode or virtual mode, you can provide ToolTips and shortcut menus for individual cells by handling the CellToolTipTextNeeded and CellContextMenuStripNeeded events.

El DataGridView control intentará utilizar filas compartidas cada vez que se agregan filas a la DataGridViewRowCollection.The DataGridView control will automatically attempt to use shared rows whenever rows are added to the DataGridViewRowCollection. Use las directrices siguientes para asegurarse de que se comparten las filas:Use the following guidelines to ensure that rows are shared:

Para determinar si se comparte una fila, use el DataGridViewRowCollection.SharedRow método para recuperar el objeto de fila y, a continuación, compruebe el objeto Index propiedad.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. Filas compartidas siempre tienen un Index valor de propiedad de – 1.Shared rows always have an Index property value of –1.

Impedir que las filas dejen de estar compartidasPreventing Rows from Becoming Unshared

Filas compartidas pueden estar compartidas como resultado de acción del usuario o el código.Shared rows can become unshared as a result of code or user action. Para evitar un impacto en el rendimiento, debe evitar filas deje de estar compartida.To avoid a performance impact, you should avoid causing rows to become unshared. Durante el desarrollo de aplicaciones, puede administrar el RowUnshared evento para determinar cuándo las filas dejen de estar compartidas.During application development, you can handle the RowUnshared event to determine when rows become unshared. Esto es útil al depurar problemas de uso compartido de fila.This is useful when debugging row-sharing problems.

Para evitar que las filas dejen de estar compartidas, utilice las siguientes directrices:To prevent rows from becoming unshared, use the following guidelines:

  • Evite indizar el Rows colección o la iteración a través de él con un foreach bucle.Avoid indexing the Rows collection or iterating through it with a foreach loop. No normalmente necesitará acceso directo a las filas.You will not typically need to access rows directly. DataGridView los métodos que operan en filas toman argumentos de índice de fila en lugar de las instancias de la fila.DataGridView methods that operate on rows take row index arguments rather than row instances. Además, los controladores de eventos relacionados con la fila reciben objetos de argumento de evento con propiedades de la fila que pueden usar para manipular filas sin provocar que deje de estar compartida.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.

  • Si necesita acceso a un objeto de fila, use el DataGridViewRowCollection.SharedRow método y pase el índice real de la fila.If you need to access a row object, use the DataGridViewRowCollection.SharedRow method and pass in the row's actual index. Sin embargo, tenga en cuenta que la modificación de un objeto de fila compartido recuperado a través de este método va a modificar todas las filas que comparten este objeto.Note, however, that modifying a shared row object retrieved through this method will modify all the rows that share this object. La fila para los nuevos registros no se comparte con otras filas, sin embargo, por lo que no se verán afectada cuando se modifica cualquier otra fila.The row for new records is not shared with other rows, however, so it will not be affected when you modify any other row. Tenga en cuenta también que diferentes filas representadas por una fila compartida pueden tener distintos menús emergentes.Note also that different rows represented by a shared row may have different shortcut menus. Para recuperar el menú contextual correcto desde una instancia de fila compartida, use el GetContextMenuStrip método y pase el índice real de la fila.To retrieve the correct shortcut menu from a shared row instance, use the GetContextMenuStrip method and pass in the row's actual index. Si tiene acceso a la fila compartida ContextMenuStrip propiedad en su lugar, usará el índice de fila compartida de -1 y no se recuperará el menú contextual correcto.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.

  • Evite indizar el DataGridViewRow.Cells colección.Avoid indexing the DataGridViewRow.Cells collection. Tener acceso directamente a una celda hará que su fila primaria deje de estar compartida, instancias de un nuevo DataGridViewRow.Accessing a cell directly will cause its parent row to become unshared, instantiating a new DataGridViewRow. Controladores de eventos relacionados con la celda reciben objetos de argumento de evento con propiedades de celda que puede usar para manipular las celdas sin provocar que las filas dejen de estar compartidas.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. También puede usar el CurrentCellAddress propiedad para recuperar los índices de fila y columna de la celda actual sin tener acceso directamente a la celda.You can also use the CurrentCellAddress property to retrieve the row and column indexes of the current cell without accessing the cell directly.

  • Evite los modos de selección basada en la celda.Avoid cell-based selection modes. Estos modos de hacer que deje de estar compartida filas.These modes cause rows to become unshared. En su lugar, establezca el DataGridView.SelectionMode propiedad DataGridViewSelectionMode.FullRowSelect o DataGridViewSelectionMode.FullColumnSelect.Instead, set the DataGridView.SelectionMode property to DataGridViewSelectionMode.FullRowSelect or DataGridViewSelectionMode.FullColumnSelect.

  • No controla el DataGridViewRowCollection.CollectionChanged o DataGridView.RowStateChanged eventos.Do not handle the DataGridViewRowCollection.CollectionChanged or DataGridView.RowStateChanged events. Estos eventos hacen que las filas dejen de estar compartidas.These events cause rows to become unshared. Además, no llame a la DataGridViewRowCollection.OnCollectionChanged o DataGridView.OnRowStateChanged métodos, que generan estos eventos.Also, do not call the DataGridViewRowCollection.OnCollectionChanged or DataGridView.OnRowStateChanged methods, which raise these events.

  • No tienen acceso a la DataGridView.SelectedCells colección cuando el DataGridView.SelectionMode es el valor de propiedad FullColumnSelect, ColumnHeaderSelect, FullRowSelect, o RowHeaderSelect.Do not access the DataGridView.SelectedCells collection when the DataGridView.SelectionMode property value is FullColumnSelect, ColumnHeaderSelect, FullRowSelect, or RowHeaderSelect. Esto hace que todas las filas seleccionadas deje de estar compartida.This causes all selected rows to become unshared.

  • No llame a la DataGridView.AreAllCellsSelected método.Do not call the DataGridView.AreAllCellsSelected method. Este método puede provocar que deje de estar compartida filas.This method can cause rows to become unshared.

  • No llame a la DataGridView.SelectAll método cuando el DataGridView.SelectionMode es el valor de propiedad CellSelect.Do not call the DataGridView.SelectAll method when the DataGridView.SelectionMode property value is CellSelect. Esto hace que todas las filas que deje de estar compartida.This causes all rows to become unshared.

  • No establezca la ReadOnly o Selected propiedad de una celda a false cuando se establece la propiedad correspondiente en su columna en 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. Esto hace que todas las filas que deje de estar compartida.This causes all rows to become unshared.

  • No tienen acceso a la DataGridViewRowCollection.List propiedad.Do not access the DataGridViewRowCollection.List property. Esto hace que todas las filas que deje de estar compartida.This causes all rows to become unshared.

  • No llame a la Sort(IComparer) sobrecarga de la Sort método.Do not call the Sort(IComparer) overload of the Sort method. Ordenación con un comparador personalizado hace que todas las filas que deje de estar compartida.Sorting with a custom comparer causes all rows to become unshared.

Vea tambiénSee also