Виртуальный режим элемента управления DataGridView в Windows Forms

С помощью виртуального режима можно управлять взаимодействием между элементом управления DataGridView и пользовательским кэшем данных. Чтобы реализовать виртуальный режим, задайте для свойства VirtualMode значение true, чтобы обработать одно или несколько событий, описанные в этом разделе. Как правило, вы будете обрабатывать по меньшей мере событие CellValueNeeded, которое позволяет элементу управления выполнять поиск значений в кэше данных.

Режим привязки и виртуальный режим

Виртуальный режим необходим только в том случае, если необходимо дополнить или заменить режим привязки. В режиме привязки вы настраиваете свойство DataSource, и элемент управления автоматически загружает данные из указанного источника и возвращает в него изменения пользователя. Можно управлять отображением привязанных столбцов, а сам источник данных обычно обрабатывает такие операции, как сортировка.

Дополнение режима привязки

Вы можете дополнить режим привязки, отображая несвязанные столбцы вместе со связанными столбцами. Иногда этот режим называется смешанным, его удобно использовать для отображения таких объектов, как вычисляемые значения или элементы управления пользовательского интерфейса.

Учитывая, что несвязанные столбцы находятся за пределами источника данных, они игнорируются операциями сортировки источника данных. Таким образом, при включении сортировки в смешанном режиме необходимо управлять несвязанными данными в локальном кэше и реализовать виртуальный режим, чтобы разрешить элементу управления DataGridView взаимодействовать с ним.

Дополнительные сведения об использовании виртуального режима для сохранения значений в несвязанных столбцах см. в примерах в справочных разделах для свойства DataGridViewCheckBoxColumn.ThreeState и класса System.Windows.Forms.DataGridViewComboBoxColumn.

Замена режима привязки

Если режим привязки не соответствует вашим требованиям к производительности, вы можете управлять всеми данными в пользовательском кэше с помощью обработчиков событий виртуального режима. Например, можно использовать виртуальный режим для реализации механизма JIT-загрузки данных, в котором извлекается лишь тот объем данных из сетевой базы данных, который необходим для оптимальной производительности. Этот сценарий особенно удобен при работе с большими объемами данных с использованием медленного сетевого подключения или с клиентскими компьютерами с ограниченным объемом ОЗУ или дисковым пространством.

Дополнительные сведения об использовании виртуального режима в JIT-сценарии см. в разделе Реализация виртуального режима с JIT-загрузкой данных в элементе управления Windows Forms DataGridView.

События виртуального режима

Если данные доступны только для чтения, событие CellValueNeeded может быть единственным, которое требует обработки. Дополнительные события виртуального режима позволяют включить определенные функции, такие как изменения пользователей, добавление и удаление строк, а также транзакции на уровне строк.

Некоторые стандартные события DataGridView (например, события, возникающие при добавлении или удалении строк пользователями, а также при изменении, анализе, проверке или форматировании значений ячеек) также полезны в виртуальном режиме. Вы также можете обрабатывать события, которые позволяют сохранять значения, которые обычно не хранятся в привязанном источнике данных, например текст подсказки ячеек, текст ошибок строки, данные контекстного меню ячеек и строк, а также данные высоты строки.

Дополнительные сведения о реализации виртуального режима для управления данными чтения/записи с областью фиксации на уровне строки см. в разделе Практическое руководство. Реализация виртуального режима в элементе управления Windows Forms DataGridView.

Пример реализации виртуального режима с областью фиксации на уровне ячейки см. в справочном разделе для свойства VirtualMode.

Следующие события происходят только в том случае, если свойству VirtualMode присвоено значение true.

Мероприятие Description
CellValueNeeded Используется элементом управления для получения значения ячейки из кэша данных для отображения. Это событие возникает только для ячеек в несвязанных столбцах.
CellValuePushed Используется элементом управления для фиксации пользовательских входных данных для ячейки в кэше данных. Это событие возникает только для ячеек в несвязанных столбцах.

Вызовите метод UpdateCellValue при изменении кэшированного значения за пределами обработчика событий CellValuePushed, чтобы убедиться, что текущее значение отображается в элементе управления, и применять любой режим автоматической настройки размера.
NewRowNeeded Используется элементом управления для указания необходимости добавить новую строку в кэш данных.
RowDirtyStateNeeded Используется элементом управления для выявления незафиксированных изменений в строке.
CancelRowEdit Используется элементом управления, чтобы указать, что для строки нужно восстановить кэшированные значения.

Следующие события удобно использовать в виртуальном режиме, однако они могут использоваться независимо от настройки свойства VirtualMode.

События Description
UserDeletingRow

UserDeletedRow

RowsRemoved

RowsAdded
Используется элементом управления, чтобы указать на добавление или удаление строк, позволяя соответственно обновить кэш данных.
CellFormatting

CellParsing

CellValidating

CellValidated

RowValidating

RowValidated
Используется элементом управления для форматирования значений ячеек для отображения, анализа и проверки введенных пользователем данных.
CellToolTipTextNeeded Используется элементом управления для получения текста подсказки для ячейки, если задано свойство DataSource или свойство VirtualMode имеет значение true.

Подсказки ячеек отображаются только в том случае, если свойство ShowCellToolTips имеет значение true.
CellErrorTextNeeded

RowErrorTextNeeded
Используется элементом управления для получения текста ошибки для ячейки или строки, если задано свойство DataSource или свойство VirtualMode имеет значение true.

Вызовите метод UpdateCellErrorText или UpdateRowErrorText при изменении текста ошибки для ячейки или строки, чтобы убедиться, что текущее значение отображается в элементе управления.

Глифы ошибок для ячеек и строк отображаются, если свойства ShowCellErrors и ShowRowErrors имеют значение true.
CellContextMenuStripNeeded

RowContextMenuStripNeeded
Используется элементом управления для получения ячейки или строки ContextMenuStrip, если задано свойство DataSource элемента управления или свойство VirtualMode имеет значение true.
RowHeightInfoNeeded

RowHeightInfoPushed
Используется элементом управления для получения или сохранения сведений о высоте строки в кэше данных. Вызовите метод UpdateRowHeightInfo при изменении информации о высоте кэшированной строки за пределами обработчика событий RowHeightInfoPushed, чтобы убедиться в том, что текущее значение используется при отображении элемента управления.

Практические рекомендации по использованию виртуального режима

Если вы реализуете виртуальный режим для эффективной работы с большими объемами данных, необходимо также обеспечить эффективную работу с самим элементом управления DataGridView. Дополнительные сведения об эффективном использовании стилей ячеек, автоматической настройки размера, выделенных фрагментах и общем доступе к строкам см. в разделе Практические рекомендации по масштабированию элемента управления Windows Forms DataGridView.

См. также