2015年9月23日水曜日

DataGridView 列ヘッダー セルのドロップダウン フィルタ一覧を作成する

ExcelのフィルターのようなことをDataGridViewでも同じ操作を実現できたら・・・
とだれしもが思いますよ。


そして、ネットで調べりゃすぐにこんなサイトにたどり着きます。

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"のような文字列が返ってきます




0 件のコメント:

コメントを投稿