以前のTips「
DataGridViewの行ヘッダ(列ヘッダ)にContextMenuStripを関連付ける」のサンプル画面に行番号の実例がさりげなく写っていた。
これをご覧になった方からその方法が知りたいという要望があったので今回はこれを紹介する。(コードだけの紹介なのでイメージは上記を参照してください)
注:この方法はサイトを調べてC#のサンプルを見つけ、そこからVB用に直しただけの代物です。但し、Tipsとして公開するにあたり理解しやすいように個々のプロパティを直接引数に配置せず、一旦変数に置き換えてあります。また、行番号の右揃えの方法も追加しました。
その仕組みをみると簡単ではあるが泥臭い(APIで無理やり描画させているような感じの)もので、この程度の機能なら標準プロパティ等で指定できるようにすべきだと思う。
'///// 行ヘッダに行番号を描画 /////
Private Sub dataGridView_RowPostPaint(ByVal sender As Object, _
ByVal e As DataGridViewRowPostPaintEventArgs) _
Handles Me.RowPostPaint
' - 行番号と行の境界(枠)の左上のPOINT(X,Y)を取得
Dim RowNo As Integer = e.RowIndex + 1 '行番号を取得
Dim X as Integer = e.RowBounds.Location.X '行(Row)の境界の左上X座標
Dim Y as Integer = e.RowBounds.Location.Y ' 同上 Y座標
'塗り潰し用ブラシを作成
Using bs As SolidBrush = New SolidBrush(Me.RowHeadersDefaultCellStyle.ForeColor)
'文字列を描画
e.Graphics.DrawString(RowNo.ToString(), _ '行番号文字列
Me.DefaultCellStyle.Font, _ 'フォントを指定
bs, _ 'ブラシを指定
X + 15, Y + 4) '文字出力座標
End Using
End Sub
説明すると、DataGridViewの一行分が描画し終わったタイミング(RowPostPaintイベント)で、行ヘッダに直接文字を描画させている。このコードだけで全ての行に行番号を表示することができる。
行削除、行追加を行っても自動で更新(再描画)されるので便利である。
ここで使われる描画メソッド(
Graphics.DrawString)はフォームやコントロールに文字列を描画するときに使うものだ。(ヘルプにはフォームに文字を出力するサンプルがいろいろある)
描画位置は文字列の左上を指定するので、文字が行ヘッダの適当な位置に収まるように調整する。(この例では右に15ピクセル、下に4ピクセル移動している)
左上が開始位置なので何もしないと左揃えになる、右揃えや中央揃えにするには文字列の長さを取得して位置を調整する必要がある。
右揃えにする簡単な方法は、DrawStringのオーバーロードでStringFormatを引数に渡すタイプを使う。
'///// 行番号を右揃えで表示させる方法 /////
Private Sub dataGridView_RowPostPaint(ByVal sender As Object, _
ByVal e As DataGridViewRowPostPaintEventArgs) _
Handles Me.RowPostPaint
Dim RowNo As Integer = e.RowIndex + 1
Dim X As Integer = e.RowBounds.Location.X
Dim Y As Integer = e.RowBounds.Location.Y
Dim drawPoint As New Point(X + 35, Y + 4) '右揃え用に位置をずらす
Dim drawFormat As New StringFormat
'このフラグで右から左に出力される。
drawFormat.FormatFlags = StringFormatFlags.DirectionRightToLeft
Using bs As SolidBrush = New SolidBrush(Me.RowHeadersDefaultCellStyle.ForeColor)
e.Graphics.DrawString(RowNo.ToString(), _
Me.DefaultCellStyle.Font, _
bs, _
drawPoint, _
drawFormat)
End Using
End Sub
posted by なっちゃん at 11:36| 静岡

|
Comment(6)
|
TrackBack(1)
|
VB.NET Tips
|

|