DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Cellpainttingで描画したセルを選択したい。

環境/言語:[VB2008 win7 ]
分類:[.NET]

■VBのバージョン : Visual Basic 2008
こんにちは。
CellpainttingイベントでDateGridViewを強調させたように表示してみたのですが、その部分のセルをクリックして選択してもフォーカスが当たったようにバックが青くなりません。またセル内の黒字が赤になってしまいます。

どのようにしたら解消できるでしょうか?


Private Sub DGV_LIST_CellPainting(ByVal sender As Object, ByVal e As_
System.Windows.Forms.DataGridViewCellPaintingEventArgs) _
Handles DGV_LIST.CellPainting

If DGV_LIST.Columns(Loop_COU).Index = e.ColumnIndexAndAlso _
e.RowIndex >= 0 Then
Dim newRect As New Rectangle(e.CellBounds.X,e.CellBounds.Y, _
e.CellBounds.Width - 2, e.CellBounds.Height - 2)
Dim backColorBrush As New SolidBrush(e.CellStyle.BackColor)
Dim gridBrush As New SolidBrush(DGV_LIST.GridColor)
Dim gridLinePen As New Pen(gridBrush)

e.Graphics.FillRectangle(backColorBrush,e.CellBounds)
e.Graphics.DrawLine(gridLinePen,e.CellBounds.Left,e.CellBounds.Bottom - 1,
e.CellBounds.Right - 1,e.CellBounds.Bottom - 1)

e.Graphics.DrawLine(gridLinePen,e.CellBounds.Right - 1, e.CellBounds.Top, _
e.CellBounds.Right - 1,e.CellBounds.Bottom)

e.Graphics.DrawRectangle(Pens.Black, newRect)

If Not (e.Value Is Nothing) Then
e.Graphics.DrawString(CStr(e.Value),e.CellStyle.Font,Brushes.Crimson,e.CellBounds.
_X + 2, e.CellBounds.Y +2, StringFormat.GenericDefault)
End If
e.Handled = True

End If
End Sub
■No31276に返信(パルさんの記事)
> その部分のセルをクリックして選択してもフォーカスが当たったようにバックが青くなりません。

背景色が、backColorBrush が e.CellStyle.BackColor を基準に行われているためです。
選択しているなら、e.CellStyle.SelectionBackColor を使わねばなりません。

(それが青色かどうかは、設定されている選択色次第ですが)


> またセル内の黒字が赤になってしまいます。

…御自身で、紅色 (Brushes.Crimson) を指定されていますよね? (^^;


> どのようにしたら解消できるでしょうか?

他のセルと同じ文字色にしたいなら、背景色と同様に、
e.CellStyle.ForeColor と e.CellStyle.SelectionForeColor を
使い分ける形にすれば良いかと。

なお、選択されているかどうかは、
 If (e.State And DataGridViewElementStates.Selected) = DataGridViewElementStates.Selected Then
で判定できます。


それと、一つ重要な点として:
生成した SolidBrush は、CellPainting を抜ける前に Dispose しておく必要があります。
Dim gridLinePen As New Pen(gridBrush) も同様です。

確実に解放処理が行われるよう、Using ブロックを併用しましょう。



ついでに言うと、標準の DataGridView では、Tab キー移動時などにおいて
アクティブセルに対してフォーカス枠(破線枠)が表示されるようになっています。
これはセルを選択しているかどうかとは別の表現となりますので、必要であれば

 Dim current As Point = DGV_LIST.CurrentCellAddress
 If current.X = e.ColumnIndex AndAlso current.Y = e.RowIndex Then
  ControlPaint.DrawFocusRectangle(e.Graphics, e.CellBounds)
 End If

などを付け加えてみてください。
■No31277に返信(魔界の仮面弁士さんの記事)
かいとうありがとうございます。

> …御自身で、紅色 (Brushes.Crimson) を指定されていますよね? (^^;

あ・・・、お恥ずかしい限りです。灯台元暗しってやつですね。

詳しいアドバイスありがとうございました。
アドバイスをもとに無事に解決できました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板