DOBON.NET

DataGrid内の特定のセルの色を変える

注意:ここで紹介しているDataGridは、System.Windows.Forms名前空間のDataGrid(Windowsフォーム)です。System.Web.UI.WebControls名前空間のDataGrid(Webフォーム)ではありません。

DataGridColumnStyle.PaintメソッドをオーバーライドしたDataGridColumnStyleからの派生クラスを作成することにより、セルの色を自由に変えることが出来るようになります。

まずは次のようなクラスを作成します。このPaintメソッド内でどのようなセルにどのような色をつけるか指定します。この例ではDataGridTextBoxColumnから派生したMyDataGridTextBoxColumnクラスを作成し、値が"0"のセルを前景色が白、背景色が黒で表示するようにしています。

VB.NET
コードを隠すコードを選択
'DataGridTextBoxColumnを継承してクラスを作成
Public Class MyDataGridTextBoxColumn
    Inherits DataGridTextBoxColumn
    'Paintメソッドをオーバーライドする
    Protected Overloads Overrides Sub Paint( _
            ByVal g As Graphics, _
            ByVal bounds As Rectangle, _
            ByVal source As CurrencyManager, _
            ByVal rowNum As Integer, _
            ByVal backBrush As Brush, _
            ByVal foreBrush As Brush, _
            ByVal alignToRight As Boolean _
            )
        'セルの値を取得する
        Dim cellValue As Object = _
            Me.GetColumnValueAtRow(source, rowNum)
        If Not (cellValue Is Nothing) AndAlso _
            Not (cellValue Is DBNull.Value) Then
            '値が"0"のセルの前景色と背景色を変える
            If CType(cellValue, String) = "0" Then
                foreBrush = New SolidBrush(Color.White)
                backBrush = New SolidBrush(Color.Black)
            End If
        End If
        '基本クラスのPaintメソッドを呼び出す
        MyBase.Paint(g, bounds, source, rowNum, _
            backBrush, foreBrush, alignToRight)
    End Sub
End Class
C#
コードを隠すコードを選択
//DataGridTextBoxColumnを継承してクラスを作成
public class MyDataGridTextBoxColumn : DataGridTextBoxColumn
{
    //Paintメソッドをオーバーライドする
    protected override void Paint(Graphics g,
        Rectangle bounds,
        CurrencyManager source,
        int rowNum, Brush backBrush,
        Brush foreBrush,
        bool alignToRight)
    {
        //セルの値を取得する
        object cellValue =
            this.GetColumnValueAtRow(source, rowNum);
        if (cellValue != null)
        {
            //値が"0"のセルの前景色と背景色を変える
            if ((string) cellValue == "0" && cellValue != DBNull.Value)
            {
                foreBrush = new SolidBrush(Color.White);
                backBrush = new SolidBrush(Color.Black);
            }
        }
        //基本クラスのPaintメソッドを呼び出す
        base.Paint(g, bounds, source, rowNum,
            backBrush, foreBrush, alignToRight);
    }
}

次にセルの色を変えたい列にこの列スタイルを使うようにします。列スタイルの説明は省かれていますので、分からないという方はこちらをご覧ください。以下の例では、データソースが"Column1"という名前のDataColumnがある"DataTable1"という名前のDataTableであることを前提にしています。

VB.NET
コードを隠すコードを選択
'新しいDataGridTableStyleの作成
Dim ts As New DataGridTableStyle()
'マップ名を指定する
ts.MappingName = "DataTable1"

'列スタイルにMyDataGridTextBoxColumnを使う
Dim cs As MyDataGridTextBoxColumn
cs = New MyDataGridTextBoxColumn()
'マップ名を指定する
cs.MappingName = "Column1"
'DataGridTableStyleに追加する
ts.GridColumnStyles.Add(cs)

'テーブルスタイルをDataGridに追加する
DataGrid1.TableStyles.Add(ts)
C#
コードを隠すコードを選択
//新しいDataGridTableStyleの作成
DataGridTableStyle ts = new DataGridTableStyle();
//マップ名を指定する
ts.MappingName = "DataTable1";

//列スタイルにMyDataGridTextBoxColumnを使う
MyDataGridTextBoxColumn cs;
cs = new MyDataGridTextBoxColumn();
//マップ名を指定する
cs.MappingName = "Column3";
//DataGridTableStyleに追加する
ts.GridColumnStyles.Add(cs);

//テーブルスタイルをDataGridに追加する
DataGrid1.TableStyles.Add(ts);

補足:.NET Framework 1.1ではDataGridのDataSourceプロパティをnull(VB.NETではNothing)に設定しても、選択されたセルがクリアされないという問題があるようです。詳しくは、サポート技術情報をご覧ください。

  • 履歴:
  • 2007/3/12 選択されたセルがクリアされない問題を追記。(コメントにてご指摘いただきました。)

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。
共有する

この記事への評価

この記事へのコメント

この記事に関するコメントを投稿するには、下のボタンをクリックしてください。投稿フォームへ移動します。通常のご質問、ご意見等は掲示板へご投稿ください。