いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

DevExpress奮闘記-080 (Criteriaの内容をDataSetやDB(SQL)用の条件に変換(K18434))(CriteriaToWhereClauseHelper, GetDataSetWhere, CriteriaOperator)


以下、ちょっとしたTipsです。


GridControlなどのコントロールでは、フィルタリング情報を
実行時に設定することが出来ます。その場合、プロパティより
値を取得すると、CriteriaOperatorとしてフィルタ情報が取得できます。


このCriteriaOperatorを、別のデータソースのフィルタリング条件に
変換したいときがあります。(DataViewやSQLのWhere句など)


手動で変換していくことも可能だと思いますが、手っ取り早いのが
以下のクラスを利用する事です。

DevExpress.Data.Filtering.CriteriaToWhereClauseHelperクラス

このクラスは、DevExpressのヘルプにもドキュメンテーションされていない
クラスです。(KBに記載があるのみ)
このクラスの以下の静的メソッドを利用する事で簡単にCriteriaを変換する
ことができます。

  • GetDataSetWhere
  • GetAccessWhere
  • GetDynamicLinqWhere
  • GetMsSqlWhere
  • GetOracleWhere


今回は、データセット用の変換メソッドを利用したサンプルです。
simpleButton1_Clickメソッドにて、変換を行っています。

using System;
using DevExpress.Data.Filtering;
using DevExpress.XtraEditors;
using DevExpress.XtraGrid.Views.Grid;

namespace DevExpress_Criteria_Convert
{
    public partial class Form1 : XtraForm
    {
        private MyDataSet.MyDataTable _dataSource;
        private MyDataSet.MyDataTable _dataSource2;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            InitializeDataSource();
            BindGrid();
        }

        private void InitializeDataSource()
        {
            MyDataSet.MyDataTable table  = new MyDataSet.MyDataTable();
            MyDataSet.MyDataTable table2 = new MyDataSet.MyDataTable();

            for (int i = 0; i < 10000; i++)
            {
                table.AddMyRow(i, string.Format("name-{0}", i), DateTime.Now.AddDays(i), (i + 30));
                table2.AddMyRow(i, string.Format("name-{0}", i), DateTime.Now.AddDays(i), (i + 30));
            }

            _dataSource = table;
            _dataSource2 = table2;
        }

        private void BindGrid()
        {
            gridControl1.DataSource = _dataSource;
            dataGridView1.DataSource = _dataSource2;
        }

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            //
            // GridControl側で設定されているフィルタリング情報を、右側のDataGridViewに適用する.
            //
            CriteriaOperator criteriaOp = (gridControl1.MainView as GridView).ActiveFilterCriteria;
            string filterString = DevExpress.Data.Filtering.CriteriaToWhereClauseHelper.GetDataSetWhere(criteriaOp);

            listBoxControl1.Items.Add(filterString);

            _dataSource2.DefaultView.RowFilter = filterString;
        }
    }
}


アプリを起動すると以下の状態となります。
左側にGridControl、右側にWinForm標準のDataGridViewを配置しています。
下には、変換したCriteria情報を表示するためのリストボックスを配置しています。
デフォルトで10000件データを作成して、表示しています。


GridControl側にて、フィルタリングを設定します。


Applyボタンを押下すると右側のDataGridViewに同じフィルタリングが
設定されているのが分かります。さらに、下に変換されたCriteriaが
表示されています。



サンプルを以下の場所にアップしておきました。
試してみたい方はどうぞ。

追記:
今回の記事は、DevExpressの以下のKBを参考にしました。

================================
過去の記事については、以下のページからご参照下さい。