DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

DataGridView内の指定したセルの色を変更する

注意:DataGridViewコントロールは、.NET Framework 2.0で新しく追加されました。

ここでは、指定したセル(およびヘッダーセル)の前景色と背景色を変更する方法を紹介します。セルの値によって色を変更する方法については、こちらで説明します。

セルの前景色と背景色は、セルスタイル(DataGridViewCellStyleオブジェクト)のForeColorとBackColorプロパティで変更できます。また、選択時のセルの前景色と背景色は、SelectionForeColorとSelectionBackColorプロパティで変更できます。なお、セルスタイルに関する知識の無い方は、まずは「DataGridViewにセルスタイルを設定する」をお読みください。

以下に、現在マウスポインタの下にあるセルの背景色を赤にする例を示します。

VB.NET
コードを隠すコードを選択
'DataGridView1のCellMouseEnterイベントハンドラ
Private Sub DataGridView1_CellMouseEnter(ByVal sender As Object, _
        ByVal e As DataGridViewCellEventArgs) _
        Handles DataGridView1.CellMouseEnter
    'ヘッダー以外のセル
    If e.ColumnIndex >= 0 And e.RowIndex >= 0 Then
        Dim dgv As DataGridView = CType(sender, DataGridView)
        'セルスタイルを変更する
        dgv(e.ColumnIndex, e.RowIndex).Style.BackColor = Color.Red
        dgv(e.ColumnIndex, e.RowIndex).Style.SelectionBackColor = Color.Red
    End If
End Sub

'DataGridView1のCellMouseLeaveイベントハンドラ
Private Sub DataGridView1_CellMouseLeave(ByVal sender As Object, _
        ByVal e As DataGridViewCellEventArgs) _
        Handles DataGridView1.CellMouseLeave
    'ヘッダー以外のセル
    If e.ColumnIndex >= 0 And e.RowIndex >= 0 Then
        Dim dgv As DataGridView = CType(sender, DataGridView)
        'セルスタイルを元に戻す
        'セルスタイルを削除するなら、nullを設定してもよい
        dgv(e.ColumnIndex, e.RowIndex).Style.BackColor = Color.Empty
        dgv(e.ColumnIndex, e.RowIndex).Style.SelectionBackColor = Color.Empty
    End If
End Sub
C#
コードを隠すコードを選択
//DataGridView1のCellMouseEnterイベントハンドラ
private void DataGridView1_CellMouseEnter(object sender,
    DataGridViewCellEventArgs e)
{
    //ヘッダー以外のセル
    if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
    {
        DataGridView dgv = (DataGridView)sender;
        //セルスタイルを変更する
        dgv[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Red;
        dgv[e.ColumnIndex, e.RowIndex].Style.SelectionBackColor = Color.Red;
    }
}

//DataGridView1のCellMouseLeaveイベントハンドラ
private void DataGridView1_CellMouseLeave(object sender,
    DataGridViewCellEventArgs e)
{
    //ヘッダー以外のセル
    if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
    {
        DataGridView dgv = (DataGridView)sender;
        //セルスタイルを元に戻す
        //セルスタイルを削除するなら、nullを設定してもよい
        dgv[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Empty;
        dgv[e.ColumnIndex, e.RowIndex].Style.SelectionBackColor = Color.Empty;
    }
}

DataGridViewCellStyleオブジェクトを使いまわす

上記のようにStyle.BackColorを直接変更する方法では、こちらで説明したように、DataGridViewCellStyleオブジェクトが次々に作成されるということになるでしょう。そのようなことを避けるには、選択されたセル用と、そうでないセル用のDataGridViewCellStyleオブジェクトを事前に作っておき、これを使いまわすようにします。

具体的には、以下のような感じです。このようにすると、上記の例では目立っていたちらつきが抑えられます。

VB.NET
コードを隠すコードを選択
'デフォルトのセルスタイル
Private defaultCellStyle As DataGridViewCellStyle
'マウスポインタの下にあるセルのセルスタイル
Private mouseCellStyle As DataGridViewCellStyle

'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
    'デフォルトのセルスタイルの設定
    Me.defaultCellStyle = New DataGridViewCellStyle()
    '現在のセルのセルスタイルの設定
    Me.mouseCellStyle = New DataGridViewCellStyle()
    Me.mouseCellStyle.BackColor = Color.Red
    Me.mouseCellStyle.SelectionBackColor = Color.Red
End Sub

'DataGridView1のCellMouseEnterイベントハンドラ
Private Sub DataGridView1_CellMouseEnter(ByVal sender As Object, _
        ByVal e As DataGridViewCellEventArgs) _
        Handles DataGridView1.CellMouseEnter
    'ヘッダー以外のセル
    If e.ColumnIndex >= 0 And e.RowIndex >= 0 Then
        Dim dgv As DataGridView = CType(sender, DataGridView)
        'セルスタイルを変更する
        dgv(e.ColumnIndex, e.RowIndex).Style = Me.mouseCellStyle
    End If
End Sub

'DataGridView1のCellMouseLeaveイベントハンドラ
Private Sub DataGridView1_CellMouseLeave(ByVal sender As Object, _
        ByVal e As DataGridViewCellEventArgs) _
        Handles DataGridView1.CellMouseLeave
    'ヘッダー以外のセル
    If e.ColumnIndex >= 0 And e.RowIndex >= 0 Then
        Dim dgv As DataGridView = CType(sender, DataGridView)
        'セルスタイルを元に戻す
        'セルスタイルを削除するなら、nullを設定してもよい
        dgv(e.ColumnIndex, e.RowIndex).Style = Me.defaultCellStyle
    End If
End Sub
C#
コードを隠すコードを選択
//デフォルトのセルスタイル
private DataGridViewCellStyle defaultCellStyle;
//マウスポインタの下にあるセルのセルスタイル
private DataGridViewCellStyle mouseCellStyle;

//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
    //デフォルトのセルスタイルの設定
    this.defaultCellStyle = new DataGridViewCellStyle();
    //現在のセルのセルスタイルの設定
    this.mouseCellStyle = new DataGridViewCellStyle();
    this.mouseCellStyle.BackColor = Color.Red;
    this.mouseCellStyle.SelectionBackColor = Color.Red;
}

//DataGridView1のCellEnterイベントハンドラ
private void DataGridView1_CellEnter(object sender,
    DataGridViewCellEventArgs e)
{
    //ヘッダー以外のセル
    if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
    {
        DataGridView dgv = (DataGridView)sender;
        //セルスタイルを変更する
        dgv[e.ColumnIndex, e.RowIndex].Style = this.mouseCellStyle;
    }
}

//DataGridView1のCellLeaveイベントハンドラ
private void DataGridView1_CellLeave(object sender,
    DataGridViewCellEventArgs e)
{
    //ヘッダー以外のセル
    if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
    {
        DataGridView dgv = (DataGridView)sender;
        //セルスタイルを元に戻す
        //セルスタイルを削除するなら、nullを設定してもよい
        dgv[e.ColumnIndex, e.RowIndex].Style = this.defaultCellStyle;
    }
}

ヘッダーの色を変更する

同様の方法で、ヘッダーセルの色を指定することもできます。ただし、Application.EnableVisualStylesメソッドなどによりvisualスタイルが有効になっている時は、変更できません。このような場合は、例えば、DataGridView.EnableHeadersVisualStylesプロパティをFalseにしてヘッダーのvisualスタイルを無効にします。

列ヘッダー、行ヘッダーそして左上隅のヘッダーセルの背景色を変更する例を示します。

VB.NET
コードを隠すコードを選択
'列ヘッダーの背景色を黄色にする
DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Yellow
'行ヘッダーの背景色を黄緑色にする
DataGridView1.RowHeadersDefaultCellStyle.BackColor = Color.YellowGreen
'左上隅のヘッダーセルの背景色を青にする
DataGridView1.TopLeftHeaderCell.Style.BackColor = Color.Blue
C#
コードを隠すコードを選択
//列ヘッダーの背景色を黄色にする
DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Yellow;
//行ヘッダーの背景色を黄緑色にする
DataGridView1.RowHeadersDefaultCellStyle.BackColor = Color.YellowGreen;
//左上隅のヘッダーセルの背景色を青にする
DataGridView1.TopLeftHeaderCell.Style.BackColor = Color.Blue;

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

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。