Windows 窗体 DataGridView 控件中的单元格样式

DataGridView 控件内的每个单元格都可以有自己的样式,如文本格式、背景色、前景色和字体。 但是,多个单元格通常会共享特定的样式特征。

共享样式的单元格组可能包含特定行或列内的所有单元格、包含特定值的所有单元格或控件内的所有单元格。 由于这些单元格组是重叠的,因此,每个单元格都可以从多处获取其样式信息。 例如,您可能希望 DataGridView 控件中的每个单元格都使用相同字体,只有货币列的单元格使用货币格式,并且只有带负数的货币单元格使用红色前景色。

DataGridViewCellStyle 类

DataGridViewCellStyle 类包含与视觉样式相关的下列属性:

此类还包含与格式设置相关的下列属性:

有关这些属性和其他单元格样式属性的更多信息,请参见 DataGridViewCellStyle 参考文档和下面“请参见”部分列出的主题。

使用 DataGridViewCellStyle 对象

可以从 DataGridViewDataGridViewColumnDataGridViewRowDataGridViewCell 类及其派生类的各个属性中检索 DataGridViewCellStyle 对象。 如果这些属性中有一个尚未设置,则检索该属性的值将新建 DataGridViewCellStyle 对象。 您还可以实例化自己的 DataGridViewCellStyle 对象,并将这些对象分配给以上属性。

在多个 DataGridView 元素间共享 DataGridViewCellStyle 对象可以避免不必要地重复样式信息。 由于在控件、列和行三个级别设置的样式从每个级别向下筛选直到单元格级别,因此,在每个级别上仅设置与其上面的级别不同的那些样式属性,也可以避免样式重复。 相关内容在后面的“样式继承”部分有更详细的说明。

下表列出获取或设置 DataGridViewCellStyle 对象的主要属性。

Property

说明

DefaultCellStyle

DataGridViewDataGridViewColumnDataGridViewRow 和派生类

获取或设置整个控件(包括标头单元格)、一列或一行中所有单元格使用的默认样式。

RowsDefaultCellStyle

DataGridView

获取或设置控件中所有行使用的默认单元格样式。 不包括标头单元格。

AlternatingRowsDefaultCellStyle

DataGridView

获取或设置控件中交替行使用的默认单元格样式。 用于创建帐目型的效果。

RowHeadersDefaultCellStyle

DataGridView

获取或设置控件的行标头使用的默认单元格样式。 如果启用视觉样式,则用当前主题进行重写。

ColumnHeadersDefaultCellStyle

DataGridView

获取或设置控件的列标头使用的默认单元格样式。 如果启用视觉样式,则用当前主题进行重写。

Style

DataGridViewCell 和派生类

获取或设置在单元格级别指定的样式。 这些样式将重写那些从较高级别继承的样式。

InheritedStyle

DataGridViewCellDataGridViewRowDataGridViewColumn 和派生类

获取当前应用于单元格、行或列的所有样式,包括从较高级别继承的样式。

如上所述,如果以前没有设置过样式属性,则获取样式属性值将自动实例化新的 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.ColumnHeadersDefaultCellStyleDataGridView.RowHeadersDefaultCellStyle

  3. DataGridView.DefaultCellStyle

下图阐释此过程。

类型 DataGridViewCellStyle 的属性

还可以访问由特定的行和列继承的样式。 列 InheritedStyle 属性从下列属性继承其属性值。

  1. DataGridViewColumn.DefaultCellStyle

  2. DataGridView.DefaultCellStyle

InheritedStyle 属性从下列属性继承其属性值。

  1. DataGridViewRow.DefaultCellStyle

  2. DataGridView.AlternatingRowsDefaultCellStyle(仅限于索引号为奇数的行中的单元格)

  3. DataGridView.RowsDefaultCellStyle

  4. DataGridView.DefaultCellStyle

对于 InheritedStyle 属性返回的 DataGridViewCellStyle 对象中的每个属性,均从相应列表中的第一个单元格样式获得其属性值,该列表中对应的属性被设置为 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 值是列表中的第一个实际值。 这个值作为单元格的 InheritedStyleForeColor 属性值。

下图阐释不同的 DataGridViewCellStyle 属性如何从不同的地方继承其属性值。

DataGridView 属性/值继承

可以利用样式继承为整个控件提供相应的样式,而不必在多处指定相同的信息。

如上所述,虽然标头单元格参与了样式继承,但是,DataGridView 控件的 ColumnHeadersDefaultCellStyleRowHeadersDefaultCellStyle 属性返回的对象具有以下的初始属性值,这些属性值将重写 DefaultCellStyle 属性返回的对象的属性值。 对于 DefaultCellStyle 属性返回的对象,如果要将为其设置的属性应用于行标头和列标头,则对于 ColumnHeadersDefaultCellStyleRowHeadersDefaultCellStyle 属性返回的对象,必须将其对应的属性设置为为 DataGridViewCellStyle 类指定的默认值。

提示

如果启用了视觉样式,则行标头和列标头(TopLeftHeaderCell 除外)的样式将自动由当前主题设置,并重写由这些属性指定的任何样式。

DataGridViewButtonColumnDataGridViewImageColumnDataGridViewCheckBoxColumn 类型还对以下对象的某些值进行初始化,该对象由列 DefaultCellStyle 属性返回。 有关更多信息,请参见这些类型的参考文档。

动态设置样式

要使用特定值自定义单元格样式,需要实现 DataGridView.CellFormatting 事件的处理程序。 此事件的处理程序接收 DataGridViewCellFormattingEventArgs 类型的参数。 此对象包含的属性使您可以确定正进行格式设置的单元格的值,以及该值在 DataGridView 控件中的位置。 此对象还包含 CellStyle 属性,该属性被初始化为正进行格式设置的单元格的 InheritedStyle 属性的值。 可以修改单元格样式属性,以指定适合单元格值和位置的样式信息。

提示

RowPrePaintRowPostPaint 事件还接收事件数据中的 DataGridViewCellStyle 对象,但在这种情况下,接收的对象是行 InheritedStyle 属性的只读副本,并且对该对象所做的更改不会影响控件。

您还可以动态修改单个单元格的样式,以响应 DataGridView.CellMouseEnterCellMouseLeave 等事件。 例如,在 CellMouseEnter 事件的处理程序中,您可以存储单元格背景色的当前值(通过单元格的 Style 属性检索),然后将这个当前值设置为一种新颜色,当鼠标悬停在单元格上时,这种新颜色就会突出显示相应的单元格。 然后,在 CellMouseLeave 事件的处理程序中,您可以再将背景色还原为其原始值。

提示

无论是否设置了特定的样式值,对单元格的 Style 属性中存储的值进行缓存都很重要。 如果您临时替换了某个样式设置,则将该设置还原为其原始的“未设置”状态可以确保单元格追溯到较高的级别以继承样式设置。 如果需要确定单元格的实际样式(无论该样式是否是继承的),则使用单元格的 InheritedStyle 属性。

请参见

任务

如何:设置 Windows 窗体 DataGridView 控件的默认单元格样式

参考

DataGridView

DataGridViewCellStyle

DataGridView.AlternatingRowsDefaultCellStyle

DataGridView.ColumnHeadersDefaultCellStyle

DataGridView.DefaultCellStyle

DataGridView.RowHeadersDefaultCellStyle

DataGridView.RowsDefaultCellStyle

DataGridViewBand.InheritedStyle

DataGridViewRow.InheritedStyle

DataGridViewColumn.InheritedStyle

DataGridViewBand.DefaultCellStyle

DataGridViewCell.InheritedStyle

DataGridViewCell.Style

DataGridView.CellFormatting

DataGridView.CellStyleContentChanged

DataGridView.RowPrePaint

DataGridView.RowPostPaint

概念

Windows 窗体 DataGridView 控件中的数据格式设置

其他资源

Windows 窗体 DataGridView 控件中的基本格式设置和样式设置