Windows フォーム DataGridView コントロールでのセルのスタイル

DataGridView コントロール内の各セルには、テキストの書式設定、背景色、前景色、フォントなど、独自のスタイルを持たせることができます。 ただし、一般的には、複数のセルが特定のスタイル特性を共有します。

スタイルを共有するセルのグループには、特定の行または列内のすべてのセル、特定の値を含むすべてのセル、またはコントロール内のすべてのセルが含まれます。 このようなグループは重複しているため、各セルは複数の場所からスタイル情報を取得することができます。 たとえば、DataGridView コントロール内のすべてのセルに同じフォントを使用し、通貨列内のセルにのみ通貨の書式設定を使用し、負の数の通貨セルにのみ赤い前景色を使用することができます。

DataGridViewCellStyle クラス

DataGridViewCellStyle クラスには、ビジュアル スタイルに関連する次のプロパティがあります。

また、このクラスには、書式設定に関連する次のプロパティが含まれています。

これらのプロパティや他のセル スタイル プロパティの詳細については、DataGridViewCellStyle のリファレンス ドキュメントと、次の「関連項目」セクションに記載されているトピックを参照してください。

DataGridViewCellStyle オブジェクトの使用

DataGridViewDataGridViewColumnDataGridViewRowDataGridViewCell クラスとその派生クラスのさまざまなプロパティから DataGridViewCellStyle オブジェクトを取得できます。 これらのプロパティのいずれかがまだ設定されていない場合、その値を取得すると、新しい DataGridViewCellStyle オブジェクトが作成されます。 独自の DataGridViewCellStyle オブジェクトのインスタンスを作成して、これらのプロパティに割り当てることもできます。

複数の DataGridView 要素で DataGridViewCellStyle オブジェクトを共有することで、スタイル情報の無駄な重複を避けることができます。 また、コントロール、列、行の各レベルで設定されたスタイルは、各レベルからセル レベルまでフィルター処理されるので、各レベルで上のレベルと異なるスタイル プロパティのみを設定することで、スタイルの重複を避けることができます。 これについては、後述する「スタイルの継承」で詳しく説明します。

次の表は、DataGridViewCellStyle オブジェクトを取得または設定する主なプロパティの一覧です。

プロパティ クラス 説明
DefaultCellStyle DataGridViewDataGridViewColumnDataGridViewRow、および派生クラス コントロール全体 (ヘッダー セルを含む)、列内、または行内のすべてのセルに使用される既定のスタイルを取得または設定します。
RowsDefaultCellStyle DataGridView コントロール内のすべての行で使用される既定のセル スタイルを取得または設定します。 これにはヘッダー セルは含まれません。
AlternatingRowsDefaultCellStyle DataGridView コントロール内の交互に並ぶ行に使用される既定のセル スタイルを取得または設定します。 台帳のような効果を出すために使用されます。
RowHeadersDefaultCellStyle DataGridView コントロールの行ヘッダーに使用される既定のセル スタイルを取得または設定します。 ビジュアル スタイルが有効な場合、現在のテーマによって上書きされます。
ColumnHeadersDefaultCellStyle DataGridView コントロールの列ヘッダーに使用される既定のセル スタイルを取得または設定します。 ビジュアル スタイルが有効な場合、現在のテーマによって上書きされます。
Style DataGridViewCell と派生クラス セル レベルで指定されたスタイルを取得または設定します。 これらのスタイルは、上位レベルから継承されたものよりも優先されます。
InheritedStyle DataGridViewCellDataGridViewRowDataGridViewColumn、および派生クラス 上位レベルから継承されたスタイルを含め、セル、行、または列に現在適用されているすべてのスタイルを取得します。

前述のとおり、スタイル プロパティの値を取得すると、そのプロパティが以前に設定されていない場合は、自動的に新しい DataGridViewCellStyle オブジェクトのインスタンスが作成されます。 このようなオブジェクトを不必要に作成されないようにするには、行と列のクラスに HasDefaultCellStyle プロパティがあり、DefaultCellStyle プロパティが設定されているかどうかを確認してください。 同様に、このセル クラスには、Style プロパティが設定されているかどうかを示す HasStyle プロパティがあります。

それぞれのスタイル プロパティには、DataGridView コントロールに対応する PropertyNameChanged イベントがあります。 行、列、セルのプロパティの場合、イベント名は "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

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 property-value inheritance

スタイルの継承を利用することで、同じ情報を複数の場所で指定することなく、コントロール全体に適切なスタイルを指定することができます。

ヘッダー セルはスタイルの継承に参加していますが、DataGridView コントロールの ColumnHeadersDefaultCellStyle および RowHeadersDefaultCellStyle プロパティから返されるオブジェクトには、DefaultCellStyle プロパティから返されるオブジェクトのプロパティ値を上書きする初期プロパティ値があります。 DefaultCellStyle プロパティから返されるオブジェクトに設定されたプロパティを行と列のヘッダーに適用する場合は、ColumnHeadersDefaultCellStyle および RowHeadersDefaultCellStyle プロパティから返されるオブジェクトの対応するプロパティを、DataGridViewCellStyle クラスに指定された既定値に設定する必要があります。

注意

ビジュアル スタイルが有効な場合、行と列のヘッダー (TopLeftHeaderCellを除く) は、現在のテーマによって自動的にスタイルが設定され、これらのプロパティによって指定されたスタイルは上書きされます。

DataGridViewButtonColumnDataGridViewImageColumnDataGridViewCheckBoxColumn 型によって、列 DefaultCellStyle プロパティから返されるオブジェクトの一部の値も初期化されます。 詳細については、これらの型のリファレンス ドキュメントを参照してください。

スタイルの動的な設定

特定の値を持つセルのスタイルをカスタマイズするには、DataGridView.CellFormatting イベントのハンドラーを実装します。 このイベントのハンドラーは DataGridViewCellFormattingEventArgs 型の引数を受け取ります。 このオブジェクトには、書式が設定されているセルの値と DataGridView コントロール内の位置を決定するためのプロパティがあります。 このオブジェクトには、書式が設定されているセルの InheritedStyle プロパティの値に初期化される CellStyle プロパティもあります。 セルのスタイル プロパティを変更して、セルの値と位置に適したスタイル情報を指定することができます。

注意

RowPrePaint および RowPostPaint イベントもイベント データで DataGridViewCellStyle オブジェクトを受け取りますが、この場合は読み取り専用の行 InheritedStyle プロパティのコピーであり、これを変更してもコントロールには影響しません。

また、DataGridView.CellMouseEnter および CellMouseLeave イベントなどのイベントに応じて、個々のセルのスタイルを動的に変更することもできます。 たとえば、CellMouseEnter イベントのハンドラーでは、セルの背景色の現在の値 (セルの Style プロパティで取得) を格納し、マウスをセルの上に移動したときに強調表示する新しい色に設定することができます。 その後、CellMouseLeave イベントのハンドラーで、背景色を元の値に戻すことができます。

注意

特定のスタイル値が設定されているかどうかにかかわらず、セルの Style プロパティに格納された値をキャッシュすることは重要です。 スタイル設定を一時的に置き換えた場合、元の "未設定" の状態に戻すことで、セルが上位レベルからのスタイル設定を継承する状態に戻ります。 スタイルが継承されているかどうかに関わらず、セルに有効な実際のスタイルを決定する必要がある場合は、セルの InheritedStyle プロパティを使用します。

関連項目