記事内に広告が含まれています。

Windows Forms:DataGridView 列・行の固定(サンプルあり)

DataGridView では、Frozen プロパティを利用することで、列や行を固定し、常に表示領域にとどめることができます。エクセルの列固定・行固定のような機能です。

列・行の固定

列・行それぞれの持つ、Frozen プロパティを利用します。下記、実装例となります。

// 1 列目を固定
this.dataGridView1.Columns[0].Frozen = true;

// 1 行目を固定
this.dataGridView1.Rows[0].Frozen = true;

複数の列・行の固定

複数の列や行を固定する場合、Frozen プロパティに一番大きいインデックスを指定することで、一括で列や行を固定することができます。

// 3 列目まで固定
this.dataGridView1.Columns[2].Frozen = true;

// 3 行目まで固定
this.dataGridView1.Rows[2].Frozen = true;

罫線の描画

Frozen プロパティによる列・行固定は実現できますが、このままではどの列・行が固定されているのかの視認性はよくありません。そこで、固定列の右端と、固定行の下端に、境界を示す罫線を描画します。デフォルトで DataGridView のセルには罫線が描画されているので、少し太めの罫線を用います。

罫線の描画は、CellPainting イベント内で行います。

private void DataGridView1_CellPainting(object? sender, DataGridViewCellPaintingEventArgs e)
{
    //ヘッダー列、ヘッダー行であれば後続の処理を行わない。
    if(e.ColumnIndex < 0 || e.RowIndex < 0)
    {
        return;
    }

    // 固定列の右側の境界線を太く描画
    if (dataGridView1.Columns[e.ColumnIndex].Frozen)
    {
        // 通常のセル描画を実行
        e.Paint(e.ClipBounds, DataGridViewPaintParts.All);

        // 罫線を描くためのペン
        using (Pen pen = new Pen(Color.Black, 5))
        {
            // セルの右側境界線を描画
            e.Graphics.DrawLine(pen, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom);
        }

        // 描画処理完了
        e.Handled = true;
    }

    // 固定行の右側の境界線を太く描画
    if (dataGridView1.Rows[e.RowIndex].Frozen)
    {
        // 通常のセル描画を実行
        e.Paint(e.ClipBounds, DataGridViewPaintParts.All);

        // 罫線を描くためのペン
        using (Pen pen = new Pen(Color.Black, 5))
        {
            // セルの下側境界線を描画
            e.Graphics.DrawLine(pen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right, e.CellBounds.Bottom - 1);
        }

        // 描画処理完了
        e.Handled = true;
    }
}

サンプルアプリケーション

サンプルアプリケーションは、.NET 8 で作成されています。

実行結果

固定列・固定行がスクロール後にも、常に表示領域に固定表示されていることが分かります。

-Windows Forms