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 で作成されています。
実行結果
固定列・固定行がスクロール後にも、常に表示領域に固定表示されていることが分かります。