2006年09月29日

DataGridViewの行ヘッダに行番号を表示させるには

以前の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 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
こんにちは。

すばらしい解説とサンプルをありがとうございました。
早速、利用させていただきます。
DataGridからDataGridViewに変わって、
アレ?ということが多くなかなか先に進まない状態でした。

Posted by .NETはじめました at 2006年10月02日 12:17
DataGridViewのRowHeaderに文字列を書く
方法については、こちらに書かれて
いましたよ。
http://www.vbdotnetforums.com/showthread.php?t=7552
ここの#6のコメントにコードがあります。
Posted by ふぇりしあ at 2006年11月21日 12:36
情報ありがとうございます。

試してみたところ、確かに行ヘッダに文字が出力されましたが、文字列開始位置がかなり右寄りなので文字が途中で切れてしまいました。もう少し幅を取ればいいのですが、先のサンプルと比べると使い勝手は良くありません。行番号ではなく選択状態を示す記号など別の用途なら便利だと思います。
Posted by なっちゃん at 2006年11月21日 14:24
文字が切れるのは、DataGridViewの
RowHeadersWidthSizeModeを
AutSizeToAllHeadersとかAutoSizeToDisplayedHeadersにすれば
とりあえず切れることはないようです。
また同じプロパティをDisableResizingに
すれば幅は自分で決めれますし。

文字列開始位置が右側になってしまうのは
選択用のカーソル(>向きの△)が表示
されてしまうから、その分幅をとる
のでしょうね。あれが消せるといいんですが・・・。
Posted by ふぇりしあ at 2006年11月25日 11:13
こちらのページでも同じようなことをやっていますよ。
http://mnow.wankuma.com/cs2005_datagridview_control7.html
Posted by えムナウ at 2006年12月22日 13:29
どうもです。
私が参考にさせてもらったC#のサンプルというのはあなたのものですm(_ _)m
他にも海外のサイトとか調べましたが似たようなものでしたので、他に方法がないのだと諦め、サンプルを参考にVB用に手直ししました。
お陰様でVBユーザーに喜ばれております。
Posted by なっちゃん at 2006年12月22日 14:17
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

DataGridView(System.Windows.Forms.DataGridView)その4
Excerpt: DataGridView(System.Windows.Forms.DataGridView)その4
Weblog: 主婦と.NETと犬のぶろぐ
Tracked: 2006-12-22 12:50
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。