DataGridView:列の非表示方法と非表示列のセル値取得(サンプルあり)

📋 目次(クリックで展開)

DataGridView で「ID やシステム管理用の内部コードなど、画面には表示したくないけれど、プログラムの処理内では値を使いたい」というシチュエーションは多く存在します。

画面から隠してしまうと値が参照できなくなるように思えますが、DataGridView では非表示状態の列からでも簡単にセルの値を取得することができます。

今回は、列の表示・非表示を制御する基本手順と、非表示にした列から安全にセル値を取得する実務的な実装方法について解説します。

列の表示・非表示を切り替える方法

DataGridView の列を表示、または非表示にするには、各列の Visible プロパティを制御します。false を設定すると非表示になり、true を設定すると再表示されます。

実務では、列のインデックス(番号)で指定するよりも、列名(Name)で指定する方が、将来的な列の追加・並び替えによるバグを防げるため安全です。

// 非推奨:インデックス(0番目の列)で指定する方法
dataGridView1.Columns[0].Visible = false;
// 推奨:列名("Id" という名前の列)で指定する方法
dataGridView1.Columns["Id"].Visible = false;

なお、ユーザーに見せる必要がない列であれば、コントロールの初期化処理(Form_Load など)のタイミングで一括して Visible = false; に設定しておくのが一般的です。

非表示にした列のセル値を取得する方法

「画面上で非表示(Visible = false)になっている列のデータは取得できるのか」という疑問を持つ方も多いですが、非表示になっていてもセルのデータ(Value)はメモリ上に保持されているため、通常通り取得が可能です。

現在の選択行(CurrentRow)から、非表示である「Id」列の値を取得するコードは以下のようになります。

// 列が非表示であっても、通常通り Value プロパティから値を取得できます
if (dataGridView1.CurrentRow != null)
{
string id = dataGridView1.CurrentRow.Cells["Id"].Value?.ToString() ?? "";
}

さらに実務的なアプローチ(データバインド時)

もし DataGridView に BindingList などのオブジェクトをバインドしている場合は、セルから値を引き出すのではなく、行の背景にあるデータモデル(DataBoundItem)から直接プロパティを取得する方が、型安全かつスマートです。

// データバインドしている場合は、モデルから直接取る方がスマートです
if (dataGridView1.CurrentRow?.DataBoundItem is MemberModel selectedMember)
{
string id = selectedMember.Id; // 非表示列の値も型安全に取得可能
}

実装コード

下記は、BindingList を使用してデータを表示し、1列目(ID列)を非表示に設定した上で、ボタンクリック時にその非表示列の値を正しく取得するサンプルコードです。

Form1.cs
using System.ComponentModel;
namespace DataGridView_Column_Visibility
{
public partial class Form1 : Form
{
private BindingList<MemberModel> _members = new();
public Form1()
{
InitializeComponent();
InitializeDataGridView();
}
private void InitializeDataGridView()
{
// サンプルデータの追加
_members.Add(new MemberModel("M001", "山田 太郎", "開発部"));
_members.Add(new MemberModel("M002", "佐藤 花子", "営業部"));
dataGridView1.DataSource = _members;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
// ⭕ 明示的に「Id」列を非表示にする
// ※列名にはデータモデルのプロパティ名が自動で割り当てられます
if (dataGridView1.Columns["Id"] != null)
{
dataGridView1.Columns["Id"].Visible = false;
}
}
// 「選択行のIDを取得」ボタンのクリックイベント
private void btnGetId_Click(object sender, EventArgs e)
{
if (dataGridView1.CurrentRow == null) return;
// パターンA:非表示のセル(Cells["Id"])から直接 Value を取得する
string idFromCell = dataGridView1.CurrentRow.Cells["Id"].Value?.ToString() ?? "";
// パターンB:バインド元のデータモデル(MemberModel)から直接取得する(推奨)
if (dataGridView1.CurrentRow.DataBoundItem is MemberModel member)
{
string idFromModel = member.Id;
// 画面で非表示になっていても、どちらの方法でも正しく値が取得できます
MessageBox.Show($"セルから取得: {idFromCell}\nモデルから取得: {idFromModel}");
}
}
}
// データモデルクラス
public class MemberModel
{
public string Id { get; set; }
public string Name { get; set; }
public string Department { get; set; }
public MemberModel(string id, string name, string department)
{
Id = id;
Name = name;
Department = department;
}
}
}

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

DataGridView_Column_Visibility.zip
※ サンプルアプリケーションは、.NET 9 をターゲットに作成しています。

よくある間違いと注意点

列の非表示制御を実装する際、記述するタイミングや指定方法を誤ると、予期せぬエラー(NullReferenceException など)を発生させることがあります。

DataSource を設定する前に Visible を変更している

// ❌ エラーになるコード例
dataGridView1.Columns["Id"].Visible = false; // この時点では列がまだ存在しない
dataGridView1.DataSource = _members;

DataGridView の列が自動生成(AutoGenerateColumns = true)される設定の場合、列が作られるのは DataSource プロパティにデータが代入された瞬間です。データを入れる前に Columns["Id"] にアクセスしようとすると、列が存在しないため NullReferenceException でクラッシュします。必ず DataSource を設定した後に Visible を変更 してください。

非表示列に対して Focus() や CurrentCell の設定はできない

画面上に表示されていないセルに対して、プログラムから強制的にフォーカスを移動させようとしたり、選択状態(CurrentCell)に指定したりすることはできません。これを行うとランタイムエラーが発生するため、非表示列のセルはあくまで「値の参照・書き換え」のみに留めてください。

まとめ

今回は、DataGridView で特定の列を非表示にする方法と、非表示列から安全にデータ値を取得する方法について解説しました。

「ユーザーに見せる必要のない内部データは隠し、プログラム側でのみハンドリングする」というのは、業務アプリケーションの画面設計における鉄板のパターンです。

DataGridView の Visible プロパティと Value(または DataBoundItem)の仕様を正しく理解しておけば、画面の見た目をスッキリと保ちつつ、裏側で堅牢なデータ処理ロジックを組み立てることができるようになります。

非表示列を上手に活用した、スマートな画面開発の参考になれば幸いです。


💬 コメント