|   | 
 
|  
 .NET TIPS 
DataGridViewコントロールで行番号を表示するには?[2.0のみ、C#、VB]
デジタルアドバンテージ 遠藤 孝信 
2006/09/29 | 
  | 
 
 
 
 | 
 DataGridViewコントロールには行番号を表示する機能はないが、行ヘッダ部分に行番号を直接描画することによりこれを実現できる。次の画面はそのようにして行番号を表示しているDataGridViewコントロールである。
  
 | 
| 行番号を表示したDataGridViewコントロール | 
| DataGridViewコントロールには行番号を表示する機能がないため、行ヘッダ部分に行番号を直接描画している。 | 
 このように行番号を表示するには、各行が描画された後に(行ごとに)発生するRowPostPaintイベントのタイミングで、その行の「インデックス番号+1」を行ヘッダのセル内に収まるように描画すればよい。
 RowPostPaintイベント・ハンドラでは、第2パラメータとして渡されるDataGridViewRowPostPaintEventArgsオブジェクト(System.Windows.Forms名前空間)から、描画に必要なGraphicsオブジェクトや、描画対象となる行全体の長方形の座標などが得られる。
 以下に今回の行番号表示に必要なデータを列挙する(変数eはDataGridViewRowPostPaintEventArgsオブジェクトを、変数dgvはDataGridViewコントロールを参照しているものとする)。
| オブジェクト | 
内容 | 
 
| e.Graphics | 
Graphicsオブジェクト | 
 
| e.RowIndex | 
表示する行番号(0始まりのため+1する必要あり) | 
 
| e.RowBounds.X | 
行ヘッダ・セルの左上隅のX座標 | 
 
| e.RowBounds.Y | 
行ヘッダ・セルの左上隅のY座標 | 
 
| e.RowBounds.Height | 
行ヘッダ・セルの高さ(行によって異なる) | 
 
| dgv.RowHeadersWidth | 
行ヘッダ・セルの幅(すべての行で同じ) | 
 
| dgv.RowHeadersDefaultCellStyle.Font | 
描画に使用するフォント | 
 
| dgv.RowHeadersDefaultCellStyle.ForeColor | 
テキストの前景色 | 
 
 
 | 
| 行番号表示に必要なデータ | 
| 変数eはDataGridViewRowPostPaintEventArgsオブジェクトを、変数dgvはDataGridViewコントロールを参照しているものとする。 | 
 以上のデータがあれば、行ヘッダのセル内に行番号を描画することができる。以下にそのサンプル・プログラムを示す。上記のDataGridViewコントロールの画面はこれを実行したときのものだ。
 このサンプル・プログラムでは、まず行番号を描画する領域を求め、TextRendererクラス(System.Windows.Forms名前空間)のDrawTextメソッドを使用して、その領域内で縦方向中央かつ右詰めで行番号を描画している。
 
// dgvlinenum.cs 
 
using System; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Windows.Forms; 
 
public class MyForm : Form { 
 
  DataGridView dgv; 
 
  // DataGridViewのRowPostPaintイベント・ハンドラ 
  void dgv_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { 
 
    // 行ヘッダのセル領域を、行番号を描画する長方形とする 
    // (ただし右端に4ドットのすき間を空ける) 
    Rectangle rect = new Rectangle( 
      e.RowBounds.Location.X, 
      e.RowBounds.Location.Y, 
      dgv.RowHeadersWidth - 4, 
      e.RowBounds.Height); 
 
    // 上記の長方形内に行番号を縦方向中央&右詰めで描画する 
    // フォントや前景色は行ヘッダの既定値を使用する 
    TextRenderer.DrawText( 
      e.Graphics, 
      (e.RowIndex + 1).ToString(), 
      dgv.RowHeadersDefaultCellStyle.Font, 
      rect, 
      dgv.RowHeadersDefaultCellStyle.ForeColor, 
      TextFormatFlags.VerticalCenter | TextFormatFlags.Right); 
  } 
 
 
  // フォームのLoadイベント・ハンドラ 
  void MyForm_Load(object sender, EventArgs e) { 
    // データソースとして画像デコーダ一覧を使用 
    dgv.DataSource = ImageCodecInfo.GetImageDecoders(); 
  } 
 
  // フォームのコンストラクタ 
  public MyForm() { 
    dgv = new DataGridView(); 
    dgv.Dock = DockStyle.Fill; 
    dgv.RowPostPaint 
      += new DataGridViewRowPostPaintEventHandler(dgv_RowPostPaint); 
    this.Controls.Add(dgv); 
    this.Size = new Size(480, 240); 
    this.Load += new EventHandler(MyForm_Load); 
  } 
} 
 
class Program { 
  static void Main() { 
    Application.Run(new MyForm()); 
  } 
} 
 
// コンパイル方法:csc dgvlinenum.cs 
 | 
 
 
 | 
| DataGridViewコントロールで行番号を表示するC#のサンプル・プログラム(dgvlinenum.cs) | 
 | 
 
' dgvlinenum.vb 
 
Imports System 
Imports System.Drawing 
Imports System.Drawing.Imaging 
Imports System.Windows.Forms 
 
Public Class MyForm 
    Inherits Form 
 
  WithEvents dgv As DataGridView 
 
  ' DataGridViewのRowPostPaintイベント・ハンドラ 
  Sub dgv_RowPostPaint(sender As Object, e As DataGridViewRowPostPaintEventArgs) Handles dgv.RowPostPaint 
 
    ' 行ヘッダのセル領域を、行番号を描画する長方形とする 
    ' (ただし右端に4ドットのすき間を空ける) 
    Dim rect As New Rectangle( _ 
      e.RowBounds.Location.X, _ 
      e.RowBounds.Location.Y, _ 
      dgv.RowHeadersWidth - 4, _ 
      dgv.Rows(e.RowIndex).Height) 
 
    ' 上記の長方形内に行番号を縦方向中央&右詰で描画する 
    ' フォントや色は行ヘッダの既定値を使用する 
    TextRenderer.DrawText( _ 
      e.Graphics, _ 
      (e.RowIndex + 1).ToString(), _ 
      dgv.RowHeadersDefaultCellStyle.Font, _ 
      rect, _ 
      dgv.RowHeadersDefaultCellStyle.ForeColor, _ 
      TextFormatFlags.VerticalCenter Or TextFormatFlags.Right) 
  End Sub 
 
  ' フォームのLoadイベント・ハンドラ 
  Sub MyForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    ' データソースとして画像デコーダ一覧を使用 
    dgv.DataSource = ImageCodecInfo.GetImageDecoders() 
  End Sub 
 
  ' フォームのコンストラクタ 
  Public Sub New() 
    dgv = New DataGridView() 
    dgv.Dock = DockStyle.Fill 
    Me.Controls.Add(dgv) 
    Me.Size = new Size(480, 240) 
  End Sub 
End Class 
 
' コンパイル方法:vbc /main:MyForm dgvlinenum.vb 
 | 
 
 
 | 
| DataGridViewコントロールで行番号を表示するVBのサンプル・プログラム(dgvlinenum.vb) | 
 | 
 ここではコードを簡便にするために、.NETで利用可能な画像のデコーダ一覧をデータソースとして使用している。画像のデコーダについては「TIPS:画像を読み込むには?」を参照してほしい。
 なお上記のサンプル・プログラムでは、データ(行数)が非常に多いと行番号の表示が行ヘッダに収まりきらない可能性がある。そのような状況が起こり得る場合には、あらかじめ行ヘッダの幅を大きめにとっておく必要があるだろう。
 
利用可能バージョン:.NET Framework 2.0のみ 
カテゴリ:Windowsフォーム 処理対象:DataGridViewコントロール 
使用ライブラリ:DataGridViewコントロール 
使用ライブラリ:DataGridViewRowPostPaintEventArgs列挙体(System.Windows.Forms名前空間) 
使用ライブラリ:TextRendererクラス(System.Windows.Forms名前空間)
 | 
 
|  
 | 
 
generated by  
 | 
 
 
 | 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間