DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

DataGridViewの行をグループ化する

注意:DataGridViewコントロールは、.NET Framework 2.0で新しく追加されました。

ここでは、DataGridViewの行を項目別にグループ化して表示する方法を紹介します。

簡単なグループ化

DataGridView: Make Groupings more Visual」には、ごく簡単なグループ化の方法が紹介されています。この方法は、一列目のセルの値がその上のセルの値と違ったら、その行の背景色を変更するというものです。

この記事を参考にさせていただいて書いたコードを以下に示します。ここでは、こちらで説明した事柄を考慮して、共通のDataGridViewCellStyleオブジェクトを使用するようにしています。

VB.NET
コードを隠すコードを選択
'デフォルトのセルスタイル
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
C#
コードを隠すコードを選択
//デフォルトのセルスタイル
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

Outlookのリストのように、グループ化ができ、グループの折りたたみや展開ができるDataGridViewが、「OutlookGrid: grouping and arranging items in Outlook style」で紹介されています。

また、ツリー表示して折りたたみや展開ができるDataGridViewが、「Customizing the DataGridView to support expanding/collapsing (ala TreeGridView)」で紹介されています。

  • 履歴:
  • 2010/5/28 リンク切れを修正。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。