以下、ちょっとした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件データを作成して、表示しています。
Applyボタンを押下すると右側のDataGridViewに同じフィルタリングが
設定されているのが分かります。さらに、下に変換されたCriteriaが
表示されています。
サンプルを以下の場所にアップしておきました。
試してみたい方はどうぞ。
追記:
今回の記事は、DevExpressの以下のKBを参考にしました。
- How to convert the CriteriaOperator to the corresponding filter string in order to use it for building SQL queries or for filtering the DataView
- Convert XPO criteria to SQL compatibl
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ