Стили ячеек элемента управления DataGridView в Windows Forms

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

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

Класс DataGridViewCellStyle

Класс DataGridViewCellStyle содержит следующие свойства, связанные с визуальным стилем:

Класс также содержит следующие свойства, связанные с форматированием:

Дополнительные сведения об этих и других свойствах стиля ячеек см. в справочной документации DataGridViewCellStyle и разделах, перечисленных в разделе "См. также" ниже.

Использование объектов DataGridViewCellStyle

Объекты DataGridViewCellStyle можно получать из различных свойств классов DataGridView, DataGridViewColumn, DataGridViewRow и DataGridViewCell, а также их производных классов. Если одно из этих свойств еще не задано, при получении его значения создается новый объект DataGridViewCellStyle. Можно также создавать собственные объекты DataGridViewCellStyle и присваивать их этим свойствам.

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

В таблице ниже перечислены основные свойства, которые получают или задают объекты DataGridViewCellStyle.

Свойство Классы Description
DefaultCellStyle DataGridView, DataGridViewColumn, DataGridViewRow и производные классы Возвращает или задает стили по умолчанию, используемые всеми ячейками в элементе управления (включая ячейки заголовков), столбце или строке.
RowsDefaultCellStyle DataGridView Возвращает или задает стили ячеек по умолчанию, используемые всеми строками в элементе управления. Сюда не входят ячейки заголовков.
AlternatingRowsDefaultCellStyle DataGridView Возвращает или задает стили ячеек по умолчанию, используемые чередующимися строками в элементе управления. Используется для создания эффекта бухгалтерской книги.
RowHeadersDefaultCellStyle DataGridView Возвращает или задает стили ячеек по умолчанию, используемые заголовками строк в элементе управления. Переопределяется текущей темой, если включены визуальные стили.
ColumnHeadersDefaultCellStyle DataGridView Возвращает или задает стили ячеек по умолчанию, используемые заголовками столбцов в элементе управления. Переопределяется текущей темой, если включены визуальные стили.
Style DataGridViewCell и производные классы Возвращает или задает стили, указанные на уровне ячейки. Эти стили переопределяют унаследованные от более высоких уровней.
InheritedStyle DataGridViewCell, DataGridViewRow, DataGridViewColumn и производные классы Возвращает все стили, применяемые в настоящее время к ячейке, строке или столбцу, включая стили, унаследованные от более высоких уровней.

Как упоминалось выше, при получении значения свойства стиля, которое не было задано ранее, автоматически создается новый объект DataGridViewCellStyle. Чтобы избежать ненужного создания этих объектов, классы строк и столбцов имеют свойство HasDefaultCellStyle, с помощью которого можно проверить, задано ли свойство DefaultCellStyle. Аналогичным образом, классы ячеек имеют свойство HasStyle, указывающее, задано ли свойство Style.

Каждое из свойств стиля имеет в элементе управления DataGridView соответствующее событие ИмяСвойстваChanged. Для свойств строки, столбца и ячейки имя события начинается с Row, Column или Cell (например, RowDefaultCellStyleChanged). Каждое из этих событий возникает, когда соответствующему свойству стиля присваивается другой объект DataGridViewCellStyle. Эти события не происходят при получении объекта DataGridViewCellStyle из свойства стиля и изменении значений его свойств. Для реагирования на изменения самих объектов стиля ячеек, обрабатывайте событие CellStyleContentChanged.

Наследование стилей

Внешний вид каждого объекта DataGridViewCell определяется свойством InheritedStyle. Объект DataGridViewCellStyle, возвращаемый этим свойством, наследует значения от иерархии свойств типа DataGridViewCellStyle. Эти свойства перечислены ниже в порядке, в котором InheritedStyle для ячеек, не являющихся заголовками, получает свои значения.

  1. DataGridViewCell.Style

  2. DataGridViewRow.DefaultCellStyle

  3. DataGridView.AlternatingRowsDefaultCellStyle (только для ячеек в строках с нечетными индексами)

  4. DataGridView.RowsDefaultCellStyle

  5. DataGridViewColumn.DefaultCellStyle

  6. DataGridView.DefaultCellStyle

Для ячеек заголовков строк и столбцов свойство InheritedStyle заполняется значениями из следующего списка исходных свойств в указанном порядке.

  1. DataGridViewCell.Style

  2. DataGridView.ColumnHeadersDefaultCellStyle или DataGridView.RowHeadersDefaultCellStyle

  3. DataGridView.DefaultCellStyle

Этот процесс представлен на схеме ниже.

Properties of type DataGridViewCellStyle

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

  1. DataGridViewColumn.DefaultCellStyle

  2. DataGridView.DefaultCellStyle

Свойство InheritedStyle строки наследует значения от следующих свойств:

  1. DataGridViewRow.DefaultCellStyle

  2. DataGridView.AlternatingRowsDefaultCellStyle (только для ячеек в строках с нечетными индексами)

  3. DataGridView.RowsDefaultCellStyle

  4. DataGridView.DefaultCellStyle

Для каждого свойства в объекте DataGridViewCellStyle, возвращаемом свойством InheritedStyle, значение получается из первого стиля ячейки в соответствующем списке, свойство которого имеет значение, отличное от значений класса DataGridViewCellStyle по умолчанию.

В таблице ниже показано, как значение свойства ForeColor для примера ячейки наследуется от содержащего ее столбца.

Свойство типа DataGridViewCellStyle Пример значения ForeColor для полученного объекта
DataGridViewCell.Style Color.Empty
DataGridViewRow.DefaultCellStyle Color.Red
DataGridView.AlternatingRowsDefaultCellStyle Color.Empty
DataGridView.RowsDefaultCellStyle Color.Empty
DataGridViewColumn.DefaultCellStyle Color.DarkBlue
DataGridView.DefaultCellStyle Color.Black

В этом случае значение Color.Red из строки ячейки является первым реальным значением в списке. Оно становится значением свойства ForeColor для InheritedStyle ячейки.

На схеме ниже показано, как различные свойства DataGridViewCellStyle могут наследовать значения из разных мест.

DataGridView property-value inheritance

Используя наследование стилей, вы можете предоставить подходящие стили для всего элемента управления, не указывая одни и те же сведения в нескольких местах.

Хотя ячейки заголовков участвуют в наследовании стилей, как описано выше, объекты, возвращаемые свойствами ColumnHeadersDefaultCellStyle и RowHeadersDefaultCellStyle элемента управления DataGridView, имеют начальные значения свойств, которые переопределяют значения свойств объекта, возвращаемого свойством DefaultCellStyle. Если нужно, чтобы свойства, которые заданы для объекта, возвращаемого свойством DefaultCellStyle, применялись к заголовкам строк и столбцов, необходимо присвоить соответствующим свойствам объектов, возвращаемых свойствами ColumnHeadersDefaultCellStyle и RowHeadersDefaultCellStyle, значения по умолчанию, указанные для класса DataGridViewCellStyle.

Примечание.

Если включены визуальные стили, стили заголовков строк и столбцов (за исключением TopLeftHeaderCell) автоматически определяются текущей темой, которая переопределяет все стили, заданные этими свойствами.

Типы DataGridViewButtonColumn, DataGridViewImageColumn и DataGridViewCheckBoxColumn также инициализируют некоторые значения объекта, возвращаемого свойством DefaultCellStyle столбца. Дополнительные сведения см. в справочной документации по этим типам.

Динамическое задание стилей

Чтобы настроить для стилей ячеек определенные значения, реализуйте обработчик события DataGridView.CellFormatting. Обработчики этого события получают аргумент типа DataGridViewCellFormattingEventArgs. Этот объект содержит свойства, которые позволяют определить значение форматируемой ячейки, а также ее расположение в элементе управления DataGridView. Этот объект также содержит свойство CellStyle, инициализируемое значением свойства InheritedStyle форматируемой ячейки. Вы можете изменить свойства стиля ячеек, чтобы указать сведения о стиле, соответствующие значению и расположению ячейки.

Примечание.

События RowPrePaint и RowPostPaint также получают объект DataGridViewCellStyle в данных события, но в их случае это копия свойства InheritedStyle строки только для чтения. Изменения этого объекта не влияют на элемент управления.

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

Примечание.

Кэширование значений, хранящихся в свойстве Style ячейки, важно независимо от того, задано ли определенное значение стиля. Если вы временно измените параметр стиля, восстановление его исходного состояния "не задано" гарантирует, что ячейка будет снова наследовать параметр стиля от более высокого уровня. Если необходимо определить фактический стиль, применяемый к ячейке, независимо от того, наследуется ли он, используйте свойство InheritedStyle ячейки.

См. также