DataGridView のセルに個別のスタイルを設定する - Visual C# プログラミング

PROGRAM


DataGridView のセルに個別のスタイルを設定する

DataGridView では、表内のセルひとつひとつに、色を付けたり書式を設定したりといった、セルのスタイルを設定することができるようになっています。

ここでは、セルの Style プロパティの値を直接編集して書式を変更する方法について記しますけど、この方法だと動作がずいぶん遅くなるような印象でした。Release ビルドでコンパイルすればだいぶ早くはなるようなのですけれどね。

そんな感じで、できれば CellFormatting イベントで DataGridView のセルにスタイルを設定する に記した方法での書式設定の方が速い気がしますし、それが本来の自然な形のようにも思えます。

スタイルの設定方法

セルのスタイルを設定するには、まず、どういったスタイルを設定するかを、次のように "DataGridViewCellStyle" クラスで定義しておく必要があります。

// DataGridViewCellStyle クラスのインスタンスを生成します。

DataGridViewCellStyle style = new DataGridViewCellStyle();

 

style.Alignment = DataGridViewContentAlignment.MiddleRight;

style.Format = @"#,##0";

style.Padding = new Padding(8, 2, 2, 8);

style.BackColor = Color.FromArgb(255, 255, 255);

例えばこのようにすることで、文字位置を「中央右寄せ」に、格納された数値を 3 桁ごとのカンマ区切りに、セル内の左右余白を 8 ポイント、上下余白を 2 ポイントに、背景色を白に、というスタイルが出来上がります。

 

セルのスタイルが作成できたら、これを DataGridView のセルに適用して行きます。

今回は話を簡単にするために "grid" という名前の変数に格納された DataGridView 内の全てのセルにこのスタイルを設定しますが、設定するセルをいくつかに限定すれば、それらにだけそのスタイルを設定することができます。

Int32 row_index;

Int32 col_index;

 

// 今回は DataGridView のすべてのセルにスタイルを設定して行きます。

for (row_index = 0; row_index < grid.Rows.Count; row_index++)

{

// 現在設定中の行を取得しています。

DataGridViewRow row = grid.Rows[row_index];

 

// 行内のすべてのセルにスタイルを設定します。

for (col_index = 0; col_index < row.Cells.Count; col_index++)

{

// 現在設定中の行の、設定中のセル(列)を取得しています。

DataGridViewCell col = row.Cells[col_index];

 

// 現在のセルに、予め用意しておいた DataGridViewCellStyle を適用します。

col.Style = style;

}

}

これで DataGridView の各セルに、書式や色といったスタイルを適用することができました。

これを基にして、偶数行ごとに背景色を変更するなどすれば、見やすい表を作ることができると思います。

桁区切りの書式を使用する際の注意

上記の例では、スタイルの "Format" プロパティで "#,##0" という書式を指定しています。

これは、数値を 3 桁毎のカンマ区切りで表示するというオプションなのですけど、これが正しく適用されるようにするためには、予めその列に格納される値が数値型である必要があります。

 

例えば DataTable を使って DataGridView 用のデータソースを作成するような場合には、次のようにして、その列に格納される値が数値型であることを明示しておく必要があります。

DataTable table = new DataTable("集計");

 

table.Columns.Add("科目コード", typeof(Int32));

table.Columns.Add("科目名");

table.Columns.Add("繰越額", typeof(Double));

 

grid.DataSource = table;

このように、列の追加の際に、列名と併せてその型を "typeof(データ型)" という形式で指定します。何も指定しない場合は、DataTable の場合は文字列型になるようでした。

再描画時にスタイルを再度適用する

DataGridView に指定してあげたスタイルは、どうやら DataGridView で並び替えを行うと、初期状態にリセットされてしまうようでした。

そのため、並び替えを行った後も適用したスタイルを維持したい場合には、DataGridView の "Sorted" イベント内で、再び同じスタイルを適用してあげる必要がありました。

DataGridView のプロパティから "Sorted" イベントをハンドルして、その中にスタイルを適用するコードを記載することで、並び替えが行われた後も、書式が設定された状態のままに見せることができます。


[ もどる ]