とだれしもが思いますよ。
そして、ネットで調べりゃすぐにこんなサイトにたどり着きます。
DataGridView 列ヘッダー セルのドロップダウン フィルタ一覧を作成する
なんだ、簡単にできるんだな。
さっそくダウンロード
Building a Drop-Down Filter List for a DataGridView Column Header Cell Sample Code
https://www.microsoft.com/en-us/download/details.aspx?id=23459
解凍し、DataGridViewAutoFilterを動かしてみます。
DataGridViewAutoFilter\DataGridViewAutoFilter\CS\DataGridViewAutoFilter¥DataGridViewAutoFilter.sin
中に DesignerSetupDemoがあるのでこちらを動かしてみます。
一番左のフィルターを使ってみます。
左から二番目のフィルターを使ってみます。
最後に Show Allのリンクをクリックをするとフィルターが解除されます。
サンプルで使われているデータは解凍したフォルダの
DataGridViewAutoFilter\DataGridViewAutoFilter\TestData.xml
をつかっているので、これを使いながらそれっぽいものを作ってみます。
いきなり、Filterの話をするのではなく、まずはxmlデータをDataGridViewに表示するところを行います。
フォームDataGridViewを配置し親ドッキングします。
今回は、 データセットを作りデータセットのReadXMLでデータをDataGridViewに流し込みます。
ファイルの追加でデータセットを選択
名前はそのままでも問題ないです。
DataSet1.xsdを選択し、データセットを表示しツールボックスのDataTableをドラッグ&ドロップします
XMLの繰り返し部分であるCustomerOrderDataをDataTable名に
書くタグをプロパティ名として追加します。
↓
あと、DataSetの画面で背景部分のしましまのとこをクリックすると
DataSetのプロパティが表示されます。
Namespaceに http://tempuri.org/DataSet1.xsd
って記載されてるので、削除しておきましょ。
→
では、読み込みます
private void Form1_Load(object sender, EventArgs e) { this.dataSet1.ReadXml("TestData.xml"); }
データが表示できたのでようやく本題のフィルタの追加をします。
まずは、DataGridViewAutoFilter.dllを追加します。
そして、using DataGridViewAutoFilter; を追加します
今度は、DataGridViewの列の編集画面を開きます
ColumnTypeを選択するとDataGridViewAutoFilterTextBoxColumnってのが選べます
ここでは、すべての列にフィルターを表示したいので選択します。
そして、実行。
できた。
ついでに、DEMOのアプリみたくクリアボタンを追加してみます。
statusStripを追加。
その上に、linkLabelを追加。
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { DataGridViewAutoFilterColumnHeaderCell.RemoveFilter(this.dataGridView1); }
DataGridViewAutoFilterColumnHeaderCellクラスのクラスメソッド(RemoveFilter)の
引数にDataGridViewAutoFilterを使っているDataGridViewのインスタンスを渡せばよいってことですね。
ちなみに、Filterを使用していないのに最初からAllFilterClearのリンクがでてるのもあれです。
そこで、DataGridViewを何かしらの操作を行い、その結果をBindして完了したタイミングで
Filterの状態を調べFilterを使用していなければ linkLabelの表示を消してしまうってのが考えられます。
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { string filterStatus = DataGridViewAutoFilterColumnHeaderCell.GetFilterStatus(this.dataGridView1); if (string.IsNullOrEmpty(filterStatus)) { this.linkLabel1.Visible = false; } else { this.linkLabel1.Visible = true; } }
またもや、DataGridViewAutoFilterColumnHeaderCellクラスのクラスメソッドを利用します。
今度は、GetFilterStatusというメソッドです。引数はもちろん、DataGridViewのインスタンス。
これでステータスがとれます。
フィルターが未選択だと空文字が返ってきます。
選択した後だと"12 of 2155 records found"のような文字列が返ってきます