FilterDataGrid作成(5)ソース:FilterDataGrid

今日はプロジェクトの最後のソースであるFilterDataGridについて
FilterDataGridはDataGridを継承したクラスで、フィルタ処理に必要ないくつかのクラスやプロパティを追加したもの。
複数のフィルタ条件を格納するためのGroupFilterなどを定義している。
これまで公開したソースを合わせるとExcelのようなフィルタ処理が可能なDataGridができる。
※Excelのフィルタ機能に近づけるにはもっと機能を追加する必要はあるが・・・。

ちなみにフィルタだけではなくDataGridTextColumnが標準で実装しているソート機能もそのまま利用することができる。

FilterDataGrid.cs
    public class FilterDataGrid : DataGrid
    {
        // 最後にフィルタをかけた列のフィルタ対象のチェックボックスリストを作成するときはViewを利用しないようにする
        public DataGridFilterTextColumn LastFilterColumn = null;
        public List<DataGridFilterTextColumn> FilteredColumns = new List<DataGridFilterTextColumn>();

        public GroupFilter _filters = new GroupFilter();
        public GroupFilter Filters { get { return _filters; } set { _filters = value; } }

        /// <summary>
        /// 複数のフィルタを適用するためのクラス
        /// Filterを適用するときに変数に格納しておく
        /// </summary>
        public class GroupFilter
        {
            private List<Predicate<object>> _filters;
            public Predicate<object> Filter { get; private set; }
            public GroupFilter()
            {
                _filters = new List<Predicate<object>>();
                Filter = InternalFilter;
            }
            private Dictionary<DataGridFilterTextColumn, Predicate<object>> ColumnPairPredicateList = new Dictionary<DataGridFilterTextColumn, Predicate<object>>();

            private bool InternalFilter(object o)
            {
                foreach (var filter in _filters)
                {
                    if (!filter(o))
                    {
                        return false;
                    }
                }

                return true;
            }

            public void AddFilter(Predicate<object> filter, DataGridFilterTextColumn column)
            {
                _filters.Add(filter);
                ColumnPairPredicateList.Add(column, filter);
            }

            public void RemoveFilterByColumn(DataGridFilterTextColumn column)
            {
                if (ColumnPairPredicateList.ContainsKey(column))
                {
                    RemoveFilter(ColumnPairPredicateList[column]);
                    ColumnPairPredicateList.Remove(column);
                }
            }

            private void RemoveFilter(Predicate<object> filter)
            {
                if (_filters.Contains(filter))
                {
                    _filters.Remove(filter);

                }
            }
        }

今日はここまで。

0 件のコメント:

コメントを投稿

PowerShellでEdgeを自動化(インストール不要。参考:郵便追跡サービス自動操作)

1.経緯について  RPAのソフトをインストールできないので、これまでVBSでCreateObjectでブラウザの自動操作をすることがたまにあった。 ※いざというときの手札として持っているだけで安心感が段違い  見た目上IEがインストールされていなくても、CreateObject...