次の方法で共有


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

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

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

DataGridViewCellStyle クラス

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

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

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

DataGridViewCellStyle オブジェクトの使用

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

複数のDataGridViewCellStyle要素間でDataGridViewオブジェクトを共有することで、スタイル情報の不要な重複を回避できます。 コントロール レベル、列レベル、行レベルで設定されたスタイルは、各レベルをフィルター処理してセル レベルまで絞り込むため、上記のレベルとは異なる各レベルでスタイル プロパティのみを設定することで、スタイルの重複を回避することもできます。 これについては、次の「スタイルの継承」セクションで詳しく説明します。

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

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

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

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

次の図は、このプロセスを示しています。

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 値がリストの最初の実数値になります。 これは、セルのForeColorInheritedStyleプロパティ値になります。

次の図は、異なる DataGridViewCellStyle プロパティが異なる場所から値を継承する方法を示しています。

DataGridView プロパティ値の継承

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

ヘッダー セルは、説明に従ってスタイルの継承に関与しますが、ColumnHeadersDefaultCellStyle コントロールのRowHeadersDefaultCellStyleおよびDataGridViewプロパティによって返されるオブジェクトには、DefaultCellStyle プロパティによって返されるオブジェクトのプロパティ値をオーバーライドする初期プロパティ値があります。 DefaultCellStyle プロパティによって返されるオブジェクトのプロパティセットを行ヘッダーと列ヘッダーに適用する場合は、ColumnHeadersDefaultCellStyleおよびRowHeadersDefaultCellStyleプロパティによって返されるオブジェクトの対応するプロパティを、DataGridViewCellStyle クラスに示されている既定値に設定する必要があります。

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

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

スタイルを動的に設定する

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

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

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

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

こちらも参照ください