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

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

C# DataGridViewにDataTableをデザイナでバインドしている際のフィルタのサンプル

Visual Studioデザイナはコントロールの作成やプロパティの設定などをGUIを通して直感的に作業でき、ほとんどコーディングせずに制作できてしまうのでプログラム初心者には大変ありがたい機能です。

しかしその反面、何か困った時にデザイナを使った場合の解説がなかなか見つかりません。

例えば DataGridView に DataTable をバインドした場合のケースです。

こちら詰まったのでメモっておきたいと思います。

 

前回こんな記事を書きました。

こちらは DataSet と DataTable と DataGridView を全てコードで生成している場合のサンプルになります。しかし、Visual Studio のデザイナを使って DataSet と DataTable を作成して、DataGridView に DataTable をバインドした場合はこの記述ではフィルタできないようです。

例えば前回のサンプルをデザイナで作成・設定するというのは下図のような感じです。

f:id:moko_03_25:20181006182710j:plain

この場合は、以下のように書けばうまく動作できました。

// すべての行を表示する場合(フィルタしない)
○○DataTableBindingSource.Filter = null;

// 列のNameが「教科」の列の値が "英語" の行だけ表示する
○○DataTableBindingSource.Filter = "教科 = '英語'";

// 列のNameが「教科」の列の値が "英語" または "国語" の行だけ表示する
○○DataTableBindingSource.Filter = "教科 = '英語' OR 教科 = '国語'";

// 「教科」列が "英語" で「点数」列が 80以上 の行だけ表示する
○○DataTableBindingSource.Filter = "教科 = '英語' AND 点数 <= 80";

// 列のNameが「教科」の列の値が "英語" 以外の行だけ表示する
○○DataTableBindingSource.Filter = "進捗 <> '英語'";


注意しないといけないのは、セルに設定された値が文字列の場合は「 ' 」(シングルクォーテーション | アポストロフィ)で囲ってやらないといけない点と、AND や OR で複数条件を指定する場合はそれぞれに列名を指定してあげないといけない点です。

演算子などの記述方法はこちらが参考になります。
DataGridコントロールで並び替え順やフィルタを指定するには?:.NET TIPS - @IT