Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
7 / 8 / 4
Регистрация: 14.12.2015
Сообщений: 81
WPF

Множественный фильтр в DataGrid

17.06.2020, 16:34. Показов 5324. Ответов 23

Студворк — интернет-сервис помощи студентам
Здравствуйте специалисты!
Не получается правильно организовать фильтрацию в DataGrid.
Разметка
XML
1
2
3
4
5
6
7
8
9
10
11
12
 
    <Window.Resources>
        <local:RowsDog x:Key="rowsDog"/>
        <CollectionViewSource x:Key="cvsRowsDog" Source="{StaticResource rowsDog}"/>
    </Window.Resources>
    <DataGrid x:Name="dgrDog" Grid.Column="1" Margin="4,6,6,6" ItemsSource="{Binding Source={StaticResource cvsRowsDog}}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Номер&#xA;договора" Binding="{Binding Number}" Width="110"/>
                <DataGridTextColumn Header="Контрагент" Binding="{Binding NameKontr}" Width="200"/>
                <DataGridTextColumn Header="Предмет&#xA;договора" Binding="{Binding Soder}" Width="300"/>
                <DataGridTextColumn Header="Сумма" Binding="{Binding Summ}" Width="110"/>
        </DataGrid>
коллекция
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
    public class RowDog : INotifyPropertyChanged
    {
        private string _Number = string.Empty;
        private string _Soder = string.Empty;
        private string _NameKontr = string.Empty;
        private decimal? _Sum = null;
        private bool _ThisDop = false;
 
        public string Number
        {
            get { return _Number; }
            set
            {
                if (value != _Number)
                {
                    _Number = value;
                    NotifyPropertyChanged("Number");
                }
            }
        }
        public string Soder
        {
            get { return _Soder; }
            set 
            {
                if (value != _Soder)
                {
                    _Soder = value;
                    NotifyPropertyChanged("Soder");
                }
            }
        }
        public string NameKontr
        {
            get { return _NameKontr; }
            set
            {
                if (value != _NameKontr)
                {
                    _NameKontr = value;
                    NotifyPropertyChanged("NameKontr");
                }
            }
        }
        public decimal? Sum
        {
            get { return _Sum; }
            set
            {
                if (value != _Sum)
                {
                    _Sum = value;
                    NotifyPropertyChanged("Sum");
                }
            }
        }
 
        public bool ThisDop
        {
            get { return _ThisDop; }
            set
            {
                if (value != _ThisDop)
                {
                    _ThisDop = value;
                    NotifyPropertyChanged("ThisDop");
                }
            }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string propName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
        }
    }
    public class RowsDog : ObservableCollection<RowDog>
    {
 
    }
и обычное заполнение из БД
C#
1
2
3
4
5
6
7
    rows.Add(new RowDog() {
                  Number = reader[1].ToString(),
                  Soder = reader[4].ToString(),
                  NameKontr = reader[20].ToString(),
                  Sum = Convert.ToDecimal(reader[7]),
                  ThisDop = reader[8].ToString() == string.Empty ? true : false,
                  });
Фильтр по одной из колонок, например, "Контрагент" работает. А вот потом пытаюсь отфильтровать по колонке "Сумма", то тоже фильтрует, но без учета первого фильтра.
Сама фильтрация
C#
1
2
3
4
5
6
7
8
9
10
11
ICollectionView cv = CollectionViewSource.GetDefaultView(dgrDog.ItemsSource);
    if (filter == string.Empty || filter == "Все") { cv.Filter = null; }
    else
    {
         cv.Filter = o =>
         {
              RowDog rowDog = o as RowDog;
              if (rowDog.NameKontr == filter) { return true; }
              else { return false; }
          };
     }
Наверное можно каждый раз пересобирать коллекцию, но может существует другой способ достичь желаемого штатными средствами wpf?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.06.2020, 16:34
Ответы с готовыми решениями:

Фильтр для DataGrid
Подскажите как все-таки правильно установить фильтр для DataGrid? Я пытаюсь установить фильтр, таким образом, что при вводе текста в...

Множественный фильтр в datagridview
Добрый день ! Есть таблица в SQLite загруженная в датагрид, на форме есть условия фильтрации (см рис). Вопрос - как правильно...

Множественный фильтр для SaveFileDialog
Здравствуйте. Вопрос, наверное, звучал, если так, переадресуйте. Есть компонент saveFileDialog. Им сохраняем рисунки в формате jpeg....

23
7 / 8 / 4
Регистрация: 14.12.2015
Сообщений: 81
11.07.2020, 21:37  [ТС]
Студворк — интернет-сервис помощи студентам
Интересный вариант, спасибо, обязательно попробую и отпишусь.
Я и застрял с ICollectionView, что не знал как реализовать MultiFilter.
Интересно, а ни кто не знает почему группировка в ListView на порядок медленнее чем в DataGrid?
Правда может нужно по-другому ее реализовывать? Я тупо в конструкторе заменил DataGrid на ListView.
0
7 / 8 / 4
Регистрация: 14.12.2015
Сообщений: 81
13.07.2020, 21:47  [ТС]
proa33, снимаю шляпу и огромное спасибо!
Это действительно то, что нужно.
Отлично отрабатывают и текстовые поиски (TextBox), и отборы (CheckBox), и фильтры (ComboBox).
И все это в различных комбинациях.
Но остался один незакрытый вопрос - почему группировка в ListView работает медленнее чем в DataGrid?
Полагаю, что, и сортировка, и фильтрация то же.
0
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
14.07.2020, 10:46
Лучший ответ Сообщение было отмечено borisvas как решение

Решение

Цитата Сообщение от borisvas Посмотреть сообщение
почему группировка в ListView работает медленнее
вряд ли что-то можно изменить
ListView устаревший компонент и не рекомендуется.
никогда им не пользовался.
1
7 / 8 / 4
Регистрация: 14.12.2015
Сообщений: 81
14.07.2020, 12:56  [ТС]
Цитата Сообщение от proa33 Посмотреть сообщение
вряд ли что-то можно изменить
ListView устаревший компонент и не рекомендуется.
никогда им не пользовался.
Спасибо!
Вот теперь все понятно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.07.2020, 12:56

Фильтр по DataGrid: числовые значения в BindingSource.Filter
Подскажите как сделать чтобы BindingSource.Filter воспринимал числовые значения? private void textBox10_TextChanged(object sender,...

Множественный фильтр
Может ктонибуть добавить на форму фильтр списка по нескольким значениям? По полу, спорт секции, форме обучения и наличию домашнего питомца....

Множественный фильтр не работает
Selection.AutoFilter Field:=2, Criteria1:=&quot;=*-1000*&quot;, Operator:=xlAnd, _ Criteria2:=&quot;&lt;&gt;*-1000390*&quot; Or &quot;&lt;&gt;*-1000400*&quot; Or &quot;&lt;&gt;*-1000402*&quot;...

Множественный фильтр данных
Уважаемые форумчане, прошу Вас помочь советом: работаю с MySQL БД через Table, есть потребность делать консолидированную фильтрацию по...

Множественный фильтр по checkbox
Добрый день! Подскажите пожалуйста, хочу в один столбец поместить несколько фильтров в зависимости от отмеченных чекбоксов. Пробовала...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru