注意:DataGridViewコントロールは、.NET Framework 2.0で新しく追加されました。
ここでは、DataGridViewの行を項目別にグループ化して表示する方法を紹介します。
「DataGridView: Make Groupings more Visual」には、ごく簡単なグループ化の方法が紹介されています。この方法は、一列目のセルの値がその上のセルの値と違ったら、その行の背景色を変更するというものです。
この記事を参考にさせていただいて書いたコードを以下に示します。ここでは、こちらで説明した事柄を考慮して、共通のDataGridViewCellStyleオブジェクトを使用するようにしています。
'デフォルトのセルスタイル Private defaultCellStyle As DataGridViewCellStyle 'グループ化された一番上の行のセルスタイル Private groupCellStyle 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.groupCellStyle = New DataGridViewCellStyle() Me.groupCellStyle.ForeColor = Color.White Me.groupCellStyle.BackColor = Color.DarkGreen Me.groupCellStyle.SelectionBackColor = Color.DarkBlue End Sub 'CellFormattingイベントハンドラ Private Sub DataGridView1_CellFormatting(ByVal sender As Object, _ ByVal e As DataGridViewCellFormattingEventArgs) _ Handles DataGridView1.CellFormatting Dim dgv As DataGridView = CType(sender, DataGridView) 'セルが1列目で、ヘッダーではなく、新しい行でもないとき If e.ColumnIndex = 0 AndAlso e.RowIndex >= 0 AndAlso _ e.RowIndex <> dgv.NewRowIndex Then If e.RowIndex = 0 OrElse _ Not dgv(e.ColumnIndex, e.RowIndex - 1).Value.Equals(e.Value) Then '1行目か、上のセルと違う値の時は、背景色を変更する dgv.Rows(e.RowIndex).DefaultCellStyle = Me.groupCellStyle Else dgv.Rows(e.RowIndex).DefaultCellStyle = Me.defaultCellStyle e.Value = "" e.FormattingApplied = True End If End If End Sub
//デフォルトのセルスタイル private DataGridViewCellStyle defaultCellStyle; //グループ化された一番上の行のセルスタイル private DataGridViewCellStyle groupCellStyle; //フォームのLoadイベントハンドラ private void Form1_Load(object sender, EventArgs e) { //セルスタイルを設定する this.defaultCellStyle = new DataGridViewCellStyle(); this.groupCellStyle = new DataGridViewCellStyle(); this.groupCellStyle.ForeColor = Color.White; this.groupCellStyle.BackColor = Color.DarkGreen; this.groupCellStyle.SelectionBackColor = Color.DarkBlue; } //CellFormattingイベントハンドラ private void DataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { DataGridView dgv = (DataGridView)sender; //セルが1列目で、ヘッダーではなく、新しい行でもないとき if (e.ColumnIndex == 0 && e.RowIndex >= 0 && e.RowIndex != dgv.NewRowIndex) { if (e.RowIndex == 0 || !dgv[e.ColumnIndex, e.RowIndex - 1].Value.Equals(e.Value)) { //1行目か、上のセルと違う値の時は、背景色を変更する dgv.Rows[e.RowIndex].DefaultCellStyle = this.groupCellStyle; } else { dgv.Rows[e.RowIndex].DefaultCellStyle = this.defaultCellStyle; e.Value = ""; e.FormattingApplied = true; } } }
結果は、次のようになります。
Outlookのリストのように、グループ化ができ、グループの折りたたみや展開ができるDataGridViewが、「OutlookGrid: grouping and arranging items in Outlook style」で紹介されています。
また、ツリー表示して折りたたみや展開ができるDataGridViewが、「Customizing the DataGridView to support expanding/collapsing (ala TreeGridView)」で紹介されています。