k1lex
@k1lex
Программист торг. сети. C# (WPF, WinForms), T-SQL

Как реализовать множественный фильтр данных?

Необходимо отфильтровать данные в CollectionViewSource в событии Filter.
В CollectionViewSource у меня находится коллекция одного класса.
С фильтром по 1 полю проблем нет. Но понадобилось сделать множественный фильтр с таким условием:
Есть 7 полей в таблице. На каждое поле есть кнопка включения фильтра по этому полю.
Подскажите как реализовать фильтр таким образом что бы при включении больше 1 фильтра они накладывались друг на друга.
Поясню на картинках что у меня получилось и как должно работать.
Есть список товаров. Все фильтры выключены. Мы видим всё. Это правильно.
7d2d46933ccb479b8701ac6294127ecf.png

Включаем фильтр по полю Наименование. Видим только товары содержащие в названии фрагмент "тор". Это правильно.
436dea0887b447fa82b706c0383213e2.png

Включаем фильтр по полю Группа2, желая из списка товаров содержащих в имени ТОР увидеть только те, которые относятся к группе с текстом "Закуски". Но получаем список содержащий "ТОР" ИЛИ "Закуски". Неправильно.

Получаем b7ded7980d7a402ea80070f02357292a.png

Мне нужно что бы в этом случае и последующих наложениях работало по И.

Для желающих ниже покажу код, по которому работает сейчас.
if (cgA != null)
            {
               //если хотя бы 1 фильр включен, то проверяем условия
                if (  this.dgGoodsAllF1.IsChecked.Value ||
                        this.dgGoodsAllF2.IsChecked.Value ||
                        this.dgGoodsAllF3.IsChecked.Value ||
                        this.dgGoodsAllF4.IsChecked.Value ||
                        this.dgGoodsAllF5.IsChecked.Value ||
                        this.dgGoodsAllF6.IsChecked.Value ||
                        this.dgGoodsAllF7.IsChecked.Value ||
                        this.dgGoodsAllF8.IsChecked.Value ||
                        this.dgGoodsAllF9.IsChecked.Value ||
                        this.cbOnLink.IsChecked.Value     ||
                        this.cbInMatrix.IsChecked.Value   ||
                        this.cbOnLink.IsChecked.Value)
               
                { 

                            if (
                                (this.dgGoodsAllF1.IsChecked == true && cgA.Code.ToString() == this.dgGoodsAllT1.Text)
                                || (this.dgGoodsAllF2.IsChecked == true && (cgA.NameLong.ToUpper().Contains(this.dgGoodsAllT2.Text.ToUpper())))
                                || (this.dgGoodsAllF3.IsChecked == true && (cgA.cgGroup2.NameLong.ToUpper().Contains(this.dgGoodsAllT3.Text.ToUpper())))
                                || (this.dgGoodsAllF4.IsChecked == true && (cgA.cgGroup3.NameLong.ToUpper().Contains(this.dgGoodsAllT4.Text.ToUpper())))
                                || (this.dgGoodsAllF5.IsChecked == true && (cgA.cgGroup4.NameLong.ToUpper().Contains(this.dgGoodsAllT5.Text.ToUpper())))
                                || (this.dgGoodsAllF6.IsChecked == true && (cgA.cgGroup5.NameLong.ToUpper().Contains(this.dgGoodsAllT6.Text.ToUpper())))
                                || (this.dgGoodsAllF7.IsChecked == true && (cgA.cgGroup6.NameLong.ToUpper().Contains(this.dgGoodsAllT7.Text.ToUpper())))
                                || (this.dgGoodsAllF8.IsChecked == true && (cgA.cgGroup7.NameLong.ToUpper().Contains(this.dgGoodsAllT8.Text.ToUpper())))
                                || (this.dgGoodsAllF9.IsChecked == true && (cgA.cgGroup8.NameLong.ToUpper().Contains(this.dgGoodsAllT9.Text.ToUpper())))
                                || (this.cbOnLink.IsChecked == true && (cgA.Group5GUID == null))
                                || (this.cbInMatrix.IsChecked == true && (cgA.InMatrix == true))
                                )
                    
                                    e.Accepted = true;
                            else
                                e.Accepted = false;
                       
                }
                else   e.Accepted = true;
            }
  • Вопрос задан
  • 549 просмотров
Решения вопроса 1
k1lex
@k1lex Автор вопроса
Программист торг. сети. C# (WPF, WinForms), T-SQL
Задачу решил сам поочередной проверкой условий.
private void CollectionViewSource_Filter(object sender, FilterEventArgs e)
        {
            cgAssortment cgA = e.Item as cgAssortment;
            bool isAccept = true;

            if (cgA != null)
            {
                try
                {
                    isAccept = isAccept && (!this.cbOnLink.IsChecked.Value || (this.cbOnLink.IsChecked == true && (cgA.Group5GUID == null)));
                    isAccept = isAccept && (!this.cbInMatrix.IsChecked.Value || (this.cbInMatrix.IsChecked == true && (cgA.InMatrix == true)));
                    isAccept = isAccept && (!this.dgGoodsAllF1.IsChecked.Value || (this.dgGoodsAllF1.IsChecked.Value && cgA.Code.ToString() == this.dgGoodsAllT1.Text));
                    isAccept = isAccept && (!this.dgGoodsAllF2.IsChecked.Value || (this.dgGoodsAllF2.IsChecked.Value && (cgA.NameLong.ToUpper().Contains(this.dgGoodsAllT2.Text.ToUpper()))));
                    isAccept = isAccept && (!this.dgGoodsAllF3.IsChecked.Value || (this.dgGoodsAllF3.IsChecked.Value && (cgA.cgGroup2.NameLong.ToUpper().Contains(this.dgGoodsAllT3.Text.ToUpper()))));
                    isAccept = isAccept && (!this.dgGoodsAllF4.IsChecked.Value || (this.dgGoodsAllF4.IsChecked.Value && cgA.cgGroup3 != null && (cgA.cgGroup3.NameLong.ToUpper().Contains(this.dgGoodsAllT4.Text.ToUpper()))));
                    isAccept = isAccept && (!this.dgGoodsAllF5.IsChecked.Value || (this.dgGoodsAllF5.IsChecked.Value && cgA.cgGroup4 != null && (cgA.cgGroup4.NameLong.ToUpper().Contains(this.dgGoodsAllT5.Text.ToUpper()))));
                    isAccept = isAccept && (!this.dgGoodsAllF6.IsChecked.Value || (this.dgGoodsAllF6.IsChecked.Value && cgA.cgGroup5 != null && (cgA.cgGroup5.NameLong.ToUpper().Contains(this.dgGoodsAllT6.Text.ToUpper()))));
                    isAccept = isAccept && (!this.dgGoodsAllF7.IsChecked.Value || (this.dgGoodsAllF7.IsChecked.Value && cgA.cgGroup6 != null && (cgA.cgGroup6.NameLong.ToUpper().Contains(this.dgGoodsAllT7.Text.ToUpper()))));
                    isAccept = isAccept && (!this.dgGoodsAllF8.IsChecked.Value || (this.dgGoodsAllF8.IsChecked.Value && cgA.cgGroup7 != null && (cgA.cgGroup7.NameLong.ToUpper().Contains(this.dgGoodsAllT8.Text.ToUpper()))));
                    isAccept = isAccept && (!this.dgGoodsAllF9.IsChecked.Value || (this.dgGoodsAllF9.IsChecked.Value && cgA.cgGroup8 != null && (cgA.cgGroup8.NameLong.ToUpper().Contains(this.dgGoodsAllT9.Text.ToUpper()))));
                }
                catch (Exception er )
                {
                    MessageBox.Show(er.Message);
                }
                e.Accepted = isAccept;
            }
        }


P.S. Другим предложениям или объяснением как лучше сделать буду только рад.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы