ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

C# DataGridViewにDataTableをデザイナでバインドしている際に列を名前で指定する

気付けば非常に簡単なことなのですが、ハマったのでメモっておきます。

 

Visual Studio のデザイナで DataSet を追加>DataTableを追加して項目を設定し‥

f:id:moko_03_25:20181007165235j:plain

Form上の DataGridView 右上の▼メニューから DataTable をバインドした場合。

f:id:moko_03_25:20181007165242j:plain

そしてForm上にはチェックボックスを用意して、チェックを外すと指定の列を非表示にしたい際に、列Indexではなく列の名前で指定したいとします。
(なぜ列Indexでの指定ではダメなのかというと、ユーザーの操作によって並んでいる列の順番が変わっている可能性があるからです。あれ、変わっていてもIndex指定でいけるのかしら‥試してません)

その場合は以下のようにコードを記述します。

// チェックボックスの状態が変わった際のイベント
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    if (checkBox1.Checked == true)
    {
        // ”教科”列を表示する
        dgv.Columns["教科"].Visible = true;
    }
    else
    {
        // ”教科”列を非表示にする
        dgv.Columns["教科"].Visible = false;
    }
}


この時「"教科"」という名前で列を指定していますが、先ほどの図を見てください。

DataTable の項目「教科」の「Name」プロパティに設定した値を指定するのではありません。

DataGridViewの「列の編集」ウインドウの「教科」の「DataPropertyName」の値でもありません。その下の「(Name)」の値が正解です。

そして紛らわしいことに、DataTableをバインドした直後は (Name) は「教科DataGridViewTextBoxColumn」なんていう値が入っていたりします。

すると列の名前を ”教科” で指定してもエラーが出ます。

チェックボックスのチェックが付いている場合

f:id:moko_03_25:20181007171013j:plain

チェックボックスのチェックを外した場合

f:id:moko_03_25:20181007171018j:plain

以上になります。