Масштабирование элемента управления DataGridView в Windows FormsBest Practices for Scaling the Windows Forms DataGridView Control

DataGridView Управления предназначен для обеспечения максимальной масштабируемости.The DataGridView control is designed to provide maximum scalability. Если требуется для отображения больших объемов данных, необходимо следовать рекомендациям, приведенным в этом разделе, чтобы избежать использования большого объема памяти или замедления работы пользовательский интерфейс (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). В этом разделе обсуждаются следующие вопросы:This topic discusses the following issues:

  • Эффективное использование стилей для ячейкиUsing cell styles efficiently

  • Эффективное использование контекстных менюUsing shortcut menus efficiently

  • Использование автоматического изменения размеров эффективноUsing automatic resizing efficiently

  • Эффективное использование выбранные коллекции ячеек, строк и столбцовUsing the selected cells, rows, and columns collections efficiently

  • Использование общих строкUsing shared rows

  • Предотвращение строкамPreventing rows from becoming unshared

Если у вас есть особые требования к производительности, можно реализовать виртуальный режим и предоставить собственные операции управления данными.If you have special performance needs, you can implement virtual mode and provide your own data management operations. Дополнительные сведения см. в разделе режимы отображения данных в элементе управления DataGridView Windows Forms.For more information, see Data Display Modes in the Windows Forms DataGridView Control.

Эффективное использование стилей для ячейкиUsing Cell Styles Efficiently

Каждой ячейки, строки и столбца может иметь свои собственные сведения о стиле.Each cell, row, and column can have its own style information. Сведения о стиле хранится в DataGridViewCellStyle объектов.Style information is stored in DataGridViewCellStyle objects. Создание объектов стиля ячеек для множества отдельных DataGridView элементы могут быть неэффективным, особенно при работе с большими объемами данных.Creating cell style objects for many individual DataGridView elements can be inefficient, especially when working with large amounts of data. Чтобы избежать снижения производительности, следуйте приведенным ниже рекомендациям:To avoid a performance impact, use the following guidelines:

Эффективное использование контекстных менюUsing Shortcut Menus Efficiently

Каждой ячейки, строки и столбца может иметь собственное контекстное меню.Each cell, row, and column can have its own shortcut menu. Контекстные меню в DataGridView управления представлены ContextMenuStrip элементов управления.Shortcut menus in the DataGridView control are represented by ContextMenuStrip controls. Как и в объекты стиля ячейки, Создание контекстного меню для множества отдельных DataGridView элементов может отрицательно сказаться на производительности.Just as with cell style objects, creating shortcut menus for many individual DataGridView elements will negatively impact performance. Чтобы избежать потерь производительности, следуйте приведенным ниже рекомендациям:To avoid this penalty, use the following guidelines:

  • Избегайте создания контекстных меню для отдельных ячеек и строк.Avoid creating shortcut menus for individual cells and rows. Это включает в себя шаблон строки, который копируется вместе с его контекстное меню, когда новые строки добавляются к элементу управления.This includes the row template, which is cloned along with its shortcut menu when new rows are added to the control. Для максимальной масштабируемости, используйте только элемента управления ContextMenuStrip свойство, чтобы указать одно контекстное меню для всего элемента управления.For maximum scalability, use only the control's ContextMenuStrip property to specify a single shortcut menu for the entire control.

  • Если требуется несколько контекстных меню для нескольких строк или ячеек, обрабатывать CellContextMenuStripNeeded или RowContextMenuStripNeeded события.If you require multiple shortcut menus for multiple rows or cells, handle the CellContextMenuStripNeeded or RowContextMenuStripNeeded events. Эти события позволяют управлять объектами контекстного меню самостоятельно, что позволяет настроить производительность.These events let you manage the shortcut menu objects yourself, allowing you to tune performance.

Использование автоматического изменения размеров эффективноUsing Automatic Resizing Efficiently

Строк, столбцов и заголовков может автоматически изменяться при изменении содержимого ячеек, все содержимое ячейки отображаются без обрезки.Rows, columns, and headers can be automatically resized as cell content changes so that the entire contents of cells are displayed without clipping. Изменение режима изменения размеров можно также изменить размер строк, столбцов и заголовков.Changing sizing modes can also resize rows, columns, and headers. Чтобы определить правильный размер DataGridView элемент управления должен проверить значение каждой ячейки, в нем.To determine the correct size, the DataGridView control must examine the value of each cell that it must accommodate. При работе с большими наборами данных этого анализа может отрицательно повлиять на производительность элемента управления при выполнении автоматического изменения размеров.When working with large data sets, this analysis can negatively impact the performance of the control when automatic resizing occurs. Чтобы избежать снижения производительности, следуйте приведенным ниже рекомендациям:To avoid performance penalties, use the following guidelines:

  • Избегайте использования автоматического изменения размеров на DataGridView элемента управления с большим набором строк.Avoid using automatic sizing on a DataGridView control with a large set of rows. При использовании автоматического изменения размеров, только изменения размера на основе отображаемых строк.If you do use automatic sizing, only resize based on the displayed rows. Используйте только те строки, отображаемые в виртуальном режиме, а также.Use only the displayed rows in virtual mode as well.

  • Для максимальной масштабируемости выключите автоматического изменения размеров и используйте программного изменения размеров.For maximum scalability, turn off automatic sizing and use programmatic resizing.

Дополнительные сведения см. в разделе параметров изменения размеров элемента управления DataGridView Windows Forms в.For more information, see Sizing Options in the Windows Forms DataGridView Control.

Эффективное использование выделенных ячеек, строк и столбцов коллекцийUsing the Selected Cells, Rows, and Columns Collections Efficiently

SelectedCells Коллекции, неэффективно с большой выбор.The SelectedCells collection does not perform efficiently with large selections. SelectedRows И SelectedColumns коллекции также могут быть неэффективным, хотя и в меньшей степени, так как существует много меньше строк, чем ячеек в стандартном DataGridView элемента управления и гораздо меньше столбцов, чем строк.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. Чтобы избежать снижения производительности при работе с этими коллекциями, следуйте приведенным ниже рекомендациям:To avoid performance penalties when working with these collections, use the following guidelines:

Использование общих строкUsing Shared Rows

Эффективного использования памяти производится в DataGridView управления с помощью общих строк.Efficient memory use is achieved in the DataGridView control through shared rows. Строки будут совместно использовать как можно больше сведений о об их внешний вид и поведение, предоставив экземпляров DataGridViewRow класса.Rows will share as much information about their appearance and behavior as possible by sharing instances of the DataGridViewRow class.

Хотя общий доступ к экземпляру строки сохраняет в памяти, строк можно легко строкам.While sharing row instances saves memory, rows can easily become unshared. Например каждый раз, когда пользователь взаимодействует непосредственно с ячейкой, соответствующей строке блокируется.For example, whenever a user interacts directly with a cell, its row becomes unshared. Так как это является обязательной, указаниям, изложенным в этом разделе полезны только в том случае, при работе с очень большими объемами данных, и только в том случае, если пользователи будут взаимодействовать с относительно небольшая часть данных при каждом запуске программы.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.

Строки не могут совместно использоваться несвязанного DataGridView элемента управления, если какие-либо ячейки содержат значения.A row cannot be shared in an unbound DataGridView control if any of its cells contain values. Когда DataGridView управления привязан к внешнему источнику данных или при реализации виртуального режима и предоставить свой собственный источник данных, значения ячеек, хранятся за пределами элемента управления, а не в объектах ячеек, что строк для совместного использования.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.

Объект строки могут совместно только в том случае, если можно определить состояние всех его ячеек из состояния строки и состояний столбцов, содержащих ячейки.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. При изменении состояния ячейки, чтобы он больше не могут быть выведены от состояния ее строки и столбца, строки не может использоваться.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.

Например строки не может использоваться в любом из следующих ситуаций:For example, a row cannot be shared in any of the following situations:

  • Строка содержит один выбранной ячейки, который не находится в выбранном столбце.The row contains a single selected cell that is not in a selected column.

  • Строка содержит ячейку с его ToolTipText или ContextMenuStrip заданными свойствами.The row contains a cell with its ToolTipText or ContextMenuStrip properties set.

  • Строка содержит DataGridViewComboBoxCell с его Items набор свойств.The row contains a DataGridViewComboBoxCell with its Items property set.

В связанном или виртуальном режиме, вы можете предоставить всплывающие подсказки и контекстные меню для отдельных ячеек, обрабатывая CellToolTipTextNeeded и CellContextMenuStripNeeded события.In bound mode or virtual mode, you can provide ToolTips and shortcut menus for individual cells by handling the CellToolTipTextNeeded and CellContextMenuStripNeeded events.

DataGridView Управления автоматически будет пытаться использовать общие строки каждый раз, когда строки добавляются к DataGridViewRowCollection.The DataGridView control will automatically attempt to use shared rows whenever rows are added to the DataGridViewRowCollection. Чтобы убедиться, что строки являются общими, следуйте приведенным ниже рекомендациям:Use the following guidelines to ensure that rows are shared:

  • Избегайте вызова Add(Object[]) перегрузки Add метод и Insert(Object[]) перегрузки Insert метод DataGridView.Rows коллекции.Avoid calling the Add(Object[]) overload of the Add method and the Insert(Object[]) overload of the Insert method of the DataGridView.Rows collection. Эти перегрузки автоматически создавать строки с монопольным доступом.These overloads automatically create unshared rows.

  • Убедитесь, что строки, заданной в DataGridView.RowTemplate свойство может использоваться в следующих случаях:Be sure that the row specified in the DataGridView.RowTemplate property can be shared in the following cases:

  • Убедитесь, что к строке, указанной indexSource параметр может использоваться при вызове AddCopy, AddCopies, InsertCopy, и InsertCopies методы DataGridView.Rows коллекции.Be sure that the row indicated by the indexSource parameter can be shared when calling the AddCopy, AddCopies, InsertCopy, and InsertCopies methods of the DataGridView.Rows collection.

  • Убедитесь, что указанной строки или строк могут использоваться при вызове Add(DataGridViewRow) перегрузки Add метод, AddRange метод, Insert(Int32,DataGridViewRow) перегрузки Insert метод и InsertRange метод DataGridView.Rowsколлекции.Be sure that the specified row or rows can be shared when calling the Add(DataGridViewRow) overload of the Add method, the AddRange method, the Insert(Int32,DataGridViewRow) overload of the Insert method, and the InsertRange method of the DataGridView.Rows collection.

Чтобы определить, является ли общим строки, используйте DataGridViewRowCollection.SharedRow метод для извлечения объекта строки, а затем проверить объекта Index свойство.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. Общие строки всегда имеют Index значение свойства равно – 1.Shared rows always have an Index property value of –1.

Предотвращение строкамPreventing Rows from Becoming Unshared

Общие строки может привести к блокированию код или действия пользователя.Shared rows can become unshared as a result of code or user action. Чтобы избежать снижения производительности, следует избегать, вызывая к строкам.To avoid a performance impact, you should avoid causing rows to become unshared. При разработке приложений, можно обрабатывать одновременно RowUnshared событие, чтобы определить, когда строкам строк.During application development, you can handle the RowUnshared event to determine when rows become unshared. Это полезно при отладке проблем с общий доступ к строкам.This is useful when debugging row-sharing problems.

Для предотвращения строк строкам, следуйте приведенным ниже рекомендациям:To prevent rows from becoming unshared, use the following guidelines:

  • Следует избегать индексирования Rows коллекции или перебирать его с foreach цикла.Avoid indexing the Rows collection or iterating through it with a foreach loop. Не потребуется обычно прямой доступ к строкам.You will not typically need to access rows directly. DataGridView методы, которые работают в строках принимать аргументы индекс строки, а не экземпляров строк.DataGridView methods that operate on rows take row index arguments rather than row instances. Кроме того обработчики для событий, связанных со строками, получают объектов аргументов событий с помощью свойств строки, которые можно использовать для операций со строками, не вызывая их к строкам.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.

  • Если вам требуется доступ к объекту строки, используйте DataGridViewRowCollection.SharedRow метод и передайте фактический индекс строки.If you need to access a row object, use the DataGridViewRowCollection.SharedRow method and pass in the row's actual index. Обратите внимание, что изменения объекта совместно используемой строкой, извлекаемых с помощью этого метода будет изменять все строки, которые совместно используют этот объект.Note, however, that modifying a shared row object retrieved through this method will modify all the rows that share this object. Строки для новых записей не используется совместно с других строк, тем не менее, поэтому он не будут затронуты при изменении любых других строк.The row for new records is not shared with other rows, however, so it will not be affected when you modify any other row. Обратите внимание, что различные строки, представленной в общей строке могут иметь различные контекстные меню.Note also that different rows represented by a shared row may have different shortcut menus. Чтобы получить правильный контекстное меню из экземпляра общей строки, используйте GetContextMenuStrip метод и передайте фактический индекс строки.To retrieve the correct shortcut menu from a shared row instance, use the GetContextMenuStrip method and pass in the row's actual index. Если доступ к совместно используемой ContextMenuStrip свойство вместо этого он будет использовать индекс совместно используемой строкой-1 и не получает соответствующее контекстное меню.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.

  • Следует избегать индексирования DataGridViewRow.Cells коллекции.Avoid indexing the DataGridViewRow.Cells collection. Прямой доступ к ячейке приведет к ее родительской строки к строкам, создания нового DataGridViewRow.Accessing a cell directly will cause its parent row to become unshared, instantiating a new DataGridViewRow. Обработчики для событий, связанных с ячейки получают объектов аргументов событий со своими свойствами ячейки, которые можно использовать для операций с ячейками, не вызывая к строкам.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. Можно также использовать CurrentCellAddress свойство для извлечения индексы строки и столбца текущей ячейки без прямого доступа к ячейке.You can also use the CurrentCellAddress property to retrieve the row and column indexes of the current cell without accessing the cell directly.

  • Избегайте режимы выбора на основе ячеек.Avoid cell-based selection modes. Эти режимы привести к строкам.These modes cause rows to become unshared. Вместо этого задайте DataGridView.SelectionMode свойства DataGridViewSelectionMode.FullRowSelect или DataGridViewSelectionMode.FullColumnSelect.Instead, set the DataGridView.SelectionMode property to DataGridViewSelectionMode.FullRowSelect or DataGridViewSelectionMode.FullColumnSelect.

  • Не обрабатывают DataGridViewRowCollection.CollectionChanged или DataGridView.RowStateChanged события.Do not handle the DataGridViewRowCollection.CollectionChanged or DataGridView.RowStateChanged events. Эти события привести к строкам.These events cause rows to become unshared. Кроме того, не следует вызывать DataGridViewRowCollection.OnCollectionChanged или DataGridView.OnRowStateChanged методы, которые инициируют эти события.Also, do not call the DataGridViewRowCollection.OnCollectionChanged or DataGridView.OnRowStateChanged methods, which raise these events.

  • Не обращаются к DataGridView.SelectedCells коллекции при DataGridView.SelectionMode свойство имеет значение FullColumnSelect, ColumnHeaderSelect, FullRowSelect, или RowHeaderSelect.Do not access the DataGridView.SelectedCells collection when the DataGridView.SelectionMode property value is FullColumnSelect, ColumnHeaderSelect, FullRowSelect, or RowHeaderSelect. В результате все выбранные строки к строкам.This causes all selected rows to become unshared.

  • Не вызывайте DataGridView.AreAllCellsSelected метод.Do not call the DataGridView.AreAllCellsSelected method. Этого метода может привести к строкам.This method can cause rows to become unshared.

  • Не вызывайте DataGridView.SelectAll метод при DataGridView.SelectionMode свойство имеет значение CellSelect.Do not call the DataGridView.SelectAll method when the DataGridView.SelectionMode property value is CellSelect. В результате все строки к строкам.This causes all rows to become unshared.

  • Не устанавливайте ReadOnly или Selected свойство ячейки для false Если присвоить соответствующее свойство в столбце 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. В результате все строки к строкам.This causes all rows to become unshared.

  • Не открывайте DataGridViewRowCollection.List свойство.Do not access the DataGridViewRowCollection.List property. В результате все строки к строкам.This causes all rows to become unshared.

  • Не вызывайте Sort(IComparer) перегрузки Sort метод.Do not call the Sort(IComparer) overload of the Sort method. Сортировка с использованием пользовательского модуля сравнения вызывает всех строк.Sorting with a custom comparer causes all rows to become unshared.

См. такжеSee also