注意:DataGridViewコントロールは、.NET Framework 2.0で新しく追加されました。
ここでは、指定したセル(およびヘッダーセル)の前景色と背景色を変更する方法を紹介します。セルの値によって色を変更する方法については、こちらで説明します。
セルの前景色と背景色は、セルスタイル(DataGridViewCellStyleオブジェクト)のForeColorとBackColorプロパティで変更できます。また、選択時のセルの前景色と背景色は、SelectionForeColorとSelectionBackColorプロパティで変更できます。なお、セルスタイルに関する知識の無い方は、まずは「DataGridViewにセルスタイルを設定する」をお読みください。
以下に、現在マウスポインタの下にあるセルの背景色を赤にする例を示します。
'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
//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; } }
上記のようにStyle.BackColorを直接変更する方法では、こちらで説明したように、DataGridViewCellStyleオブジェクトが次々に作成されるということになるでしょう。そのようなことを避けるには、選択されたセル用と、そうでないセル用のDataGridViewCellStyleオブジェクトを事前に作っておき、これを使いまわすようにします。
具体的には、以下のような感じです。このようにすると、上記の例では目立っていたちらつきが抑えられます。
'デフォルトのセルスタイル 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
//デフォルトのセルスタイル 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スタイルを無効にします。
列ヘッダー、行ヘッダーそして左上隅のヘッダーセルの背景色を変更する例を示します。
'列ヘッダーの背景色を黄色にする DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Yellow '行ヘッダーの背景色を黄緑色にする DataGridView1.RowHeadersDefaultCellStyle.BackColor = Color.YellowGreen '左上隅のヘッダーセルの背景色を青にする DataGridView1.TopLeftHeaderCell.Style.BackColor = Color.Blue
//列ヘッダーの背景色を黄色にする DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Yellow; //行ヘッダーの背景色を黄緑色にする DataGridView1.RowHeadersDefaultCellStyle.BackColor = Color.YellowGreen; //左上隅のヘッダーセルの背景色を青にする DataGridView1.TopLeftHeaderCell.Style.BackColor = Color.Blue;