Как сделать поиск в wpf
Перейти к содержимому

Как сделать поиск в wpf

  • автор:

Живой поиск System.Windows.Controls.ComboBox C# WPF

Добрый день/вечер, столкнулся с задачей сделать контекстный поиск в Windows.Controls.ComboBox. Поиск производится по любому вхождению. Например имеем: Вася, Федя, Вика Набираем «в», получаем: Вася, Вика; «ва» остается Вася; «дя» — Федя. Надеюсь смысл понятен. Доработал класс ComboBox:

using System.Collections.Generic; using System.Linq; using System.Windows.Controls; using ProgrammingWeapons; namespace Telemetria.UI < public class ComboBoxFinder : ComboBox < private bool _isAutoFilter = true; public bool IsAutoFilter < get < return _isAutoFilter; >set < _isAutoFilter = value; >> private readonly List _fullList; private string _filterText < get; set; >public ComboBoxFinder() < IsTextSearchEnabled = false; // отключение автовыбора первого элемента, иначе не работает поиск _fullList = new List(); _filterText = ""; KeyUp += (sender, args) => Filter(Text); KeyDown += (sender, args) => < if (_isAutoFilter) IsDropDownOpen = true; Filter(Text); >; SelectionChanged += (sender, args) => < //if(SelectedItem != null) Filter(""); >; > public void Filter(string text) < if (!_isAutoFilter) return; if (text.IsNull()) return; _filterText = text; if (_fullList.Count < 1) foreach (var isc in Items.SourceCollection) _fullList.Add(isc); var tmpSourceList = _fullList.Where(fl =>fl != null && fl.ToString().ToUpper().Contains(_filterText.ToUpper())).ToList(); //if (tmpSourceList.Count == 1) return; ItemsSource = tmpSourceList; > > > 

Вроде как выполняется то что нужно, но работает как-то криво. Когда выбираешь первый раз элемент отображается в заголовка, начинаю печатать для второго поиска, первая буква печатается и потом исчезает, нужно вводить ее снова, после чего все фильтруется нормально. Или второй вариант при попытке напечатать текст выскакивает выбранный элемент и данные не фильтруются. Какая ошибка когда появляется пока не пойму. Подскажите куда смотреть. WinForms использовать нельзя, т.к. не вписывается в проект. В интернете ничего не нарыл, такое ощущение что все под WinForms пишут (

Как сделать поиск в wpf

Эти элементы представлены в WPF довольно широко. Все они являются производными от класса ItemsControl , который в свою очередь является наследником класса Control. Все они содержат коллекцию элементов. Элементы могут быть напрямую добавлены в коллекцию, возможна также привязка некоторого массива данных к коллекции.

Возьмем простейший элемент-список — ListBox и определим в файле MainWindow.xaml следующий интерфейс:

  Tom Bob Sam Alice   

Элемент ItemsControl и списки в WPF и C#

Все элементы, размещенные внутри спискового элемента ListBox, представляют элементы списка.

Управление списком

Коллекция объектов внутри элемента-списка доступна в виде свойства Items . Для управления элементами из этой коллекции мы можем использовать следующие методы:

  • Add(object item) : добавление элемента
  • Clear() : полная очистка коллекции
  • Insert(int index, object item) : вставка элемента по определенному индексу в коллекции
  • Remove(object item) : удаление элемента
  • RemoveAt(int index) : удаление элемента по индексу

А свойство Count позволяет узнать, сколько элементов в коллекции.

Например, оставим предыдущий интерфейс и в файле связанного кода MainWindow.xaml.cs добавим и удалим программно несколько элементов:

using System.Windows; namespace MetanitApp < public partial class MainWindow : Window < public MainWindow() < InitializeComponent(); usersList.Items.Remove("Sam"); // удаляем элемент "Sam" usersList.Items.RemoveAt(1); // удаляем второй элемент usersList.Items.Add("Kate"); // Добавляем элемент "Kate" usersList.Items.Insert(0, "Mike"); // Вставляем элемент "Mike" на первое место в списке >> >

В данном случае добавляем и удаляем ряд элементов с помощью различных методов и в итоге получим следующий список:

Методы управления списком в ListBox в WPF и C#

При вызове методов, которые используют индексы, как выше методы RemoveAt(index) и Insert(index, object) , следует учитывать, что передаваемые индексы должны быть действительны. Естественно мы не можем удалить, к примеру, второй объект, если списке только один объект или вообще нет объектов. В этом случае мы можем проверять длину списка:

if(usersList.Items.Count > 1) // если в списке больше 1 элемента < usersList.Items.Insert(1, "Mike"); // Вставляем элемент "Mike" на второе место usersList.Items.RemoveAt(2); // удаляем третий элемент >

Отображение сложных данных

Списковые элементы могут отображать не только простые строки или числа, но и сложные данные. Например, создадим в коде новый класс Person:

public class Person < public string Name < get; set; >= ""; public int Age < get; set; >public override string ToString() < return $"Name: Age: "; > >

Теперь создадим в xaml набор объектов этого класса Person и выведем в их в списке:

Поскольку мы используем класс, определенный в текущем проекте, то соответственно у нас обязательно должно быть подключено пространство имен проекте. В моем случае проект (и пространство имен) называется «MetanitApp». Соответственно у меня это пространство имен проецируется на префикс local :

xmlns:local="clr-namespace:MetanitApp"

В принципе по умолчанию WPF уже его подключает. После этого через префикс «local» можно обращаться к классу Person: «local:Person».

Кроме того, чтобы не возникало проблем с разметкой XAML, желательно сделать перестроение проекта. И в итоге ListBox выведет все объекты:

Вывод списка объектов в ListBox в WPF и C#

По умолчанию списковые элементы выводят то, что возвращает метод ToString() объекта. Именно для этой демонстрации и реализован данный метод в классе Person выше. Но также с помощью свойства DisplayMemberPath можно установить свойство объекта, значение которого будет отображаться в списке. Например, отобразим только имя:

Свойство DisplayMemberPath в ListBox в WPF и C#

В этом случае в коде C# таким же образом можно добавлять и удалять данные:

var firstPerson = usersList.Items[0]; // получаем первый объект usersList.Items.Remove(firstPerson); // удаляем его usersList.Items.Add(new Person < Name = "Kate", Age = 23 >); // добавляем новый объект

ItemsSource

Нам необязательно вручную заполнять значения элемента управления списком, так как мы можем установить свойство ItemsSource , задав в качестве параметра коллекцию, из которой будет формироваться элемент управления списком. Например, в коде xaml-разметки определим пустой список:

А в файле отделенного кода выполним наполнение списка:

using System.Windows; using System.Collections.Generic; namespace MetanitApp; public partial class MainWindow : Window < public MainWindow() < InitializeComponent(); usersList.ItemsSource = new List() < new Person, new Person , new Person >; // устанавливаем отображаемое свойство usersList.DisplayMemberPath = "Name"; > >

Но стоит учитывать, что если мы наполняем элемент управления списком через свойство ItemsSource , то мы не сможем использовать выше рассмотренные методы Add/Remove/RemoveAt/Insert/Clear для добавления/удаления элементов списка. В этом случае для управления элементами непосредственно к самому источнику данных. Например, определим в коде xaml кнопку для добавления одного объекта:

По нажатию на кнопку будет вызываться метод Button_Click . И в файле связанного кода C# определим данный метод и наполним ListBox данными:

using System.Windows; using System.Collections.Generic; namespace MetanitApp; public partial class MainWindow : Window < Listpeople = new List() < new Person, new Person , new Person >; public MainWindow() < InitializeComponent(); usersList.ItemsSource = people; >private void Button_Click(object sender, RoutedEventArgs e) < people.Add(new Person < Name = "Mike", Age = 29 >); usersList.Items.Refresh(); > >

Здесь в качестве источника данных выступает список people, и из этого списка ListBox будет брать данные.

В обработчике нажатия кнопки добавляем в список people один объект Person для теста. Обратите внимание, что добавляем именно в стандартный список List , а не в ListBox. ListBox в данном случае просто отображает данные. Но чтобы ListBox обновил свое визуальное представление, после изменения списка people обновляем данные в ListBox:

usersList.Items.Refresh();

Обновление данных в ListBox в WPF и C#

Стоит отметить, что если в качестве источника данных выступает ObservableCollection , то нам не надо вызывает отобновление данных списка, так как коллекция ObservableCollection сама извещает систему об изменениях.

Выбор элементов

Все элементы управления списками поддерживают выделение входящих элементов. Выделенный элемент(ы) можно получить с помощью свойств SelectedItem (SelectedItems), а получить индекс выделенного элемента — с помощью свойства SelectedIndex . Свойство SelectedValue позволяет получить значение выделенного элемента.

При выделении элемента в списке генерируется событие SelectionChanged , которое мы можем обработать. Например, возьмем предыдущий список:

А в файле кода определим обработчик для этого события:

using System.Windows; using System.Windows.Controls; namespace MetanitApp; public partial class MainWindow : Window < public MainWindow() < InitializeComponent(); >private void usersList_SelectionChanged(object sender, SelectionChangedEventArgs e) < if (usersList.SelectedItem is Person person) < MessageBox.Show(person.Name); >> >

Важно учитывать, что так как в разметке xaml в списке определены элементы Person, то в коде мы можем привести объект usersList.SelectedItem к типу Person.

WPF — использование навигации по страницам, добавление контролов в NavigationWindow

В WPF существует возможность создавать приложения с возможность навигации, то есть с использованием Navigation объектов, таких как Page, NavigationService и NavigationWindow. Большинство примеров на MSDN отображает, как использовать такие объекты в XBAP приложениях, но никто не запрещает нам и создавать клиентские приложения с использованием навигации по страницам.
Итак, постараемся создать такое приложение. Создаем новый WPF Application проект, оттуда удаляем созданное Window1.xaml, добавляем две страницы FirstPage.xaml и SecondPage.xaml, а так же прописываем в App.xaml файл страницу, с которой наше приложение будет стартовать:
StartupUri=»FirstPage.xaml» После запуска мы должны увидеть окно нашего приложения, содержащее навигационную панель с кнопками перехода вперед и назад. Дальше, нам необходимо создать ссылки, которые помогали бы переходить с одной страницы на другую. Это можно сделать разными способами. Добавим в проект UserControl и назовем его ApplicationToolbar. Первая возможность, при помощи которой мы сможем осуществлять переход между страницами это использование NavigationService, создадим для этого метод обработки нажатий на кнопки со следующим кодом: private void NavigationCommand_Executed(object sender, ExecutedRoutedEventArgs e)
<
NavigationService service = NavigationService.GetNavigationService(this);
service.Navigate(new Uri(e.Parameter.ToString(), UriKind.Relative));
> Метод осуществляет переход на страницу, которая указана в параметрах команды. В xaml файле контрола ApplicationToolbar создадим команду, привяжем к ней данный метод и укажем кнопкам данную команду на выполнение:

* This source code was highlighted with Source Code Highlighter .

Таким образом мы создали панель с кнопками перехода между страницами. Можно пользоваться и более простым решением — Hyperlink, давайте добавим и его на наш контрол:

* This source code was highlighted with Source Code Highlighter .

Итак, в результате мы должны получить, приблизительно, следующий вид окна:
Untitled
Тут возникает следующее желание, положить наш контрол ApplicationToolbar на NavigationWindow (там, где располагаются навигационные кнопки). Сделать нам это поможет возможность переопределение стилей в WPF. А именно переопределение стиля для NavigationWindow.
Для того, чтобы описать новый стиль для NavigationWindow, а точнее переписать существующий, нам изначально необходимо вытащить стиль из библиотек PresentationFramework. Вообще у PresentationFramework есть несколько наборов тем, таких как Classic, Aero, Royale и Luna, каждая тема лежит в отдельной библиотеке. Я буду рассматривать библиотеку PresentationFramework.Aero с ее темой. Для того, чтобы посмотреть BAML файл (после компиляции файл xaml упаковывается в baml — Binary Application Markup) можно воспользоваться программой Reflector с плагином BamlViewer, но как показала практика — BamlViewer не очень хорошо справляется с декомпиляцией: он не верно прописывает имена ключей (Key), не верно расшифровывает данные Geometry, даже располагает описание триггеров перед описание контента стиля — из-за чего элементы в триггерах не находятся. В общем, лучше с задачей декомпиляции BAML справляется StyleExplorer. Вот небольшой скриншот сравнения данных программ:
Untitled2
Самое интересное, что значение ключей стилей действительно такими и являются как видно на скриншоте — x:Key=»Ì». То есть в своих стилях мы можем ссылаться на стиль с именем ключа Ì (если стиль подключили). Почему сделаны такие странные имена ключей — не понятно (и видно так же, что BAML Viewer не верно их распознает). В итоге, Style Explorer предоставляет нам реально работающий XAML текст — мы можем к примеру перенести к себе в проект весь XAML текст и он будет валиден, чего не скажешь о BAML Viewer. Но весь XAML нам не нужен. Нам интересно переписать представление NavigationWindow, для этого мы изначально создадим в нашем проекте новый файл ресурсов Themes/General.xaml (имя файла и каталог можно выбрать любыми). Чтобы наш файл ресурсов был доступен в приложении — мы должны его так же подключить в файле App.xaml, это делается так:

* This source code was highlighted with Source Code Highlighter .

В файле General.xaml мы так же должны подключить файл ресурсов из библиотеки PresentationFramework.Aero, чтобы мы могли в стиле нашего будущего NavigationManager использовать уже существующие стили от темы Aero. Делается это таким же способом:

* This source code was highlighted with Source Code Highlighter .

Далее из Style Explorer копируем стиль для NavigationWindow, а так же его ContentTemplate (который используется в стиле). ContentTemplate мы немного изменим, а точнее добавим наш контрол ApplicationToolbar в него, больше ничего делать не будем. Заметим, что ссылки на ресурсы вида ì, ď, ê остаются и они будут работать. В результате у нас должен получится, приблизительно, такой набор стилей (большую часть закомментировал, там все остается то, что дал нам Style Explorer):

< ControlTemplate x:Key ="ď" TargetType ="" >
< Border Background ="" BorderBrush ="" BorderThickness ="" >
< DockPanel >
< Grid Name ="NavChrome" Background ="" DockPanel . Dock ="Top" Height ="30" >
< Grid.ColumnDefinitions >
< ColumnDefinition Width ="29" />
< ColumnDefinition Width ="26" />
< ColumnDefinition Width ="17" />
< ColumnDefinition Width ="*" />

* This source code was highlighted with Source Code Highlighter .

Untitled3

В результате наше приложение будет выглядеть следующим образом:
Как видим, мы добились того, что наш контрол ApplicationToolbar теперь располагается на навигационной панели.

Как сделать поиск в wpf

Есть форма на ней есть DataGrid в DataGrid есть 5 колонок (Фамилия,Имя,Отчестно,Телефон,Электронная почта) надо сделать поиск по 3 сразу колонкам либо по 1 (только для колонок Фамилия,Имя,Отчество) если нашло, то красить фон оранжевым, а шрифт черным. Пример интерфейса:

Если знаете как сделать такое подскажите пожалуйста уже 2 дня ищу в интернете не могу найти что-то полезное.

Отслеживать
задан 4 июл 2019 в 12:41
3 3 3 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Готовый ответ дать — не так интересно, (не факт, но) может быть, не так полезно, дольше и сложнее. В комментариях писать — не поместится. Пишу тут. Но не полный ответ, а наметки.

Странно, что за два дня не нашлось ничего полезного в интернете.

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

public class Person < public string Client_id < get; set; >//int. public string Fam < get; set; >public string Name < get; set; >public string Otch < get; set; >public string Phone < get; set; >public string E_mail < get; set; >> 
  • Правильнее делать через CollectionViewSource, но, кажется, в данном случае, можно и попроще
  • Можно было бы использовать delayed binding text box (например, вот какой-то), но буду говорить о варианте попроще
public partial class ViewModel: INotifyPropertyChanged < private /*например, лист*/ List_DefaultPersons; private /*например, лист*/ List _Persons; public /*например, лист*/ List Persons < get < return _Persons; >set < _Persons = value; RaisePropertyChanged(nameof(Persons)); >> private string _SearchWord; public string SearchWord < get < return _SearchWord; >set < _SearchWord = value; Persons = FilterPersons(_DefaultPersons); >> //. > 
  • Про интерфейс INotifyPropertyChanged можно найти в интернете, здесь его не реализовывал, а использовал partial , якобы есть другой файл в котором реализация INotifyPropertyChanged . Суть в том, что при изменении свойства вызываем событие о его изменении.
  • где-нибудь в конструкторе класса можно инициализировать коллекцию персон
  • еще в конструкторе можно присвоить Persons = _DefaultPersons
  • в методе FilterPrsons надо будет написать логику фильтрации списка и поместить этот метод во ViewModel . Для начала можно просто сделать какую-нибудь промежуточную проверку, чтобы от общего потом к частному:
private List FilterPrsons() < var result = _DefaultPersons .Where(prsn =>prsn.Name.Contains(SearchWord)) .ToList(); return result; > 
  • кстати, SearchWord логичнее назвать SearchPhrase
  • Приведенная выше ViewModel — класс, который в потенциале может стать контекстом данных для того xaml -а, который приведен в вопросе. Чтобы он им стал, надо DataContext -у MainWindow присвоить экземпляр этого класса.
  • Можно добавить в SearchBox UpdateSourceTrigger=PropertyChanged , например, так:
" Width="50" /> 
  • но лучше добавить кнопку / или по клавише Enter, например: так или так или еще как-то. Иначе, если фильтрация долгая (таблица большая), то при каждом введении символа будет тормозить. Можно убрать UpdateSourceTrigger=PropertyChanged и без кнопок, без Enter-а, но тогда надо будет после введения фразы кликать в сторону, чтобы был задействован связующий binding.
  • суть с командами для кнопки (если кнопка будет) такая, чтобы во ViewModel -е было такое свойство, которое являлось бы реализацией ICommand , а потом в xaml-е присвоить его свойству кнопки Command эту штуку
  • в xaml-е, в таблице DataGrid надо прописать такую штуку:
  • а, да, там же еще есть ComboBox .. Можно его тоже привязать к свойствам ViewModel-и, например, (чтобы проще было) иметь там 4 свойства типа bool . Потом учитывать эти свойства в методе FilterPrsons . Только не забыть про такую методологию:
private bool _x; public bool x < get < return _x; >set < _x = value; RaisePropertyChanged(nameof(X)); >> 

Если делать без ViewModel, прямо в MainWindow.xaml.cs , то:

  • Можно напрямую там присваивать:
dataGrid.ItemsSource = Persons; 
  • Коллекцию персон можно определить прямо в MainWindow.xaml.cs , как и всё остальное на c#
private /*например, лист*/ List _DefaultPersons; private /*например, лист*/ List _Persons; 
  • тогда на TextBox x:Name=»SearchBox» надо будет повесить событие, например так:
private void textChangedEventHandler(object sender, TextChangedEventArgs args) < //здесь можно собрать данные из: //SearchBox //ComboBox (там нет названия, можно присвоить) //далее отфильтровать персон методом FilterPersons() //далее dataGrid.ItemsSource = _Persons; >
  • без ViewModel намного проще сделать обработчик для кнопки. Так же как и , только там Button и событие Click , далее если щелкнуть правой или левой кнопке по введенному имени (прямо в редакторе xaml-а) обработчика, то можно перейти к коду / либо посмотреть в интернете про событие Click и дописать в MainWindow.xaml.cs .

Как сделать поиск по фильтру? (WPF)

Поиск по фильтру (WPF)
Добрый день! Возник вопрос, как сделать поиск по базам данных по фильтру, не могу сделать так.

Поиск в столбце по фильтру
Проблема вот такая. В столбце более 15000 строк. Строки пронумерованы . Поиск по фильтру не.

Поиск строки в Memo по фильтру
Здравствуйте, ну расскажу так, мне нужно 1) в memo1 найти строчку по фильтру 2) надо скопировать.

Поиск по фильтру через запятую! Нужна поправка в коде!
День добрый форумчане!! Дано: Есть главная форма с параметрами поиска, на ней висит подчиненная.

103 / 51 / 17
Регистрация: 20.04.2014
Сообщений: 812
prot1, А тут та же проблема с русским языком?
Регистрация: 25.05.2015
Сообщений: 207

Не, тут надо создать его. Читал, смотрел, но что-то боюсь если сделаю, как делают люди не получиться.
Пробовал писать, но не работал.

103 / 51 / 17
Регистрация: 20.04.2014
Сообщений: 812

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

Регистрация: 25.05.2015
Сообщений: 207
Сначала ещё раз попробую другие коды, если не заработает, то скину код
877 / 556 / 291
Регистрация: 21.11.2012
Сообщений: 1,552
фильтруйте саму коллекцию, которая привязана к гриду:

 ItemsSource=""> >
var query = from st in MyEntity.MyTabelleDB where st.Schifr >=3 && st.Schifr 5 select st; MyCol = new ListMyClass>(query);

Регистрация: 25.05.2015
Сообщений: 207

Сделал по-своему, но показывает только один столбец, если столбец с именем «Шифр» используется фильтром, то все остальные пропадают, при добавление или обновлении/удалении появляются снова — впрочем так и должно быть, но как сделать чтобы все столбцы показывал/ вот код как сделал.

1 2 3 4 5 6 7 8 9 10 11
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)  SQLiteConnection sqliteCon = new SQLiteConnection(dbConnectionString); if (cb.Text == "Шифр")  SQLiteDataAdapter sda = new SQLiteDataAdapter("SELECT Шифр FROM password where Шифр like('" + tx.Text + "%')", sqliteCon); DataTable date = new DataTable(); sda.Fill(date); dataGrid1.ItemsSource = date.DefaultView; > >

Как сделать поиск

Как сделать одной функцией, поиск только цифры и поиск по количеству знаков одновременно
Есть предложение обл Владимирская, р-н Селиий, д Копнино, ул sfsdfghf, д. 27 rd 1021 601343.

Как сделать поиск?
Как сделать поиск, чтобы вводить например «Название фирмы» и выводилась не ссылка на нее, а просто.

Как сделать поиск по БД?
У меня есть форма( wpf ) На которой у меня размещен ListBox с именем «List1», имеется локальная бд.

как сделать поиск
Есть чат, посетитель сначала должен выбирать свой пол и пол собеседника, как сделать поиск, что бы.

Эксперт .NET

15225 / 10343 / 2721
Регистрация: 21.04.2018
Сообщений: 30,656
Записей в блоге: 2

Danechka2001, выложите коды относящиеся к вопросу ТЕКСТОМ в соответствующих тегах.
Скрины очень неудобно смотреть и на них нет всех нужных кодов.

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

как сделать поиск в Бд
как сделать поиск в БД MySQL какие компаненты использовать и что писать.

Как сделать поиск
Как сделать поиск Поле поиска ComboBox Поле искомое значение Edit Таблица DBGrid Поиск.

Как сделать поиск?
Как реализовать поиск в Windows Forms через sql public DataTable SearchSuppliers(string.

Как сделать поиск?
Есть две таблицы, связанные. Во второй таблице, есть подставочные поля марка и модель авто (их.

Как сделать поиск в БД?
как сделать поиск в Бд))помогите срочно Добавлено через 2 часа 30 минут точнее запрос как.

Как сделать поиск?
Вот программа не могу никак сделать поиск не выходит сделать правельно запрос. Вот программа .

WPF — Реализация алгоритмов поиска

Поиск — один из самых важных алгоритмов программы, без которого на сегодняшний день не обходиться не одна информационная система, особенно работающая с большими объёмами данных.

В этой статье я бы хотел рассказать и показать как можно реализовать алгоритмы поиска и фильтрации в приложении написанном на WPF C#.

Что такое WPF?

Windows Presentation Foundation — один из компонентов ядра .NET Framework, который позволяет разработчикам создавать богатые, различные Windows приложения.

Создаём интерфейс для алгоритма поиска и фильтрации.

Самое первое что нужно сделать, это запустить Microsoft Visual Studio. А далее создать проект выбрав пункт «Приложение WPF» — Visual C#;

Создание нового проекта WPF - Visual C#

Следующим шагом настроим минимальные значения высоты и ширины окна, а также зададим значения по умолчанию.

Настройка максимального значения высоты и ширины программы, а также значения по умолчанию.

Реализовываем следующий интерфейс используя такие элементы как: Label, ComboBox, TextBox, ListView, Button. Как пользоваться ListView можно прочитать в этой статье.

Интерфейс программы для реализации алгоритма поиска.

Далее, присвоим атрибут DisplayMemberBinding для тегов GridViewColumn, дав наименования в соответствии с рисунком ниже.

Атрибут DisplayMemberBinding для тегов GridViewColumn

Для элемента ComboBox зададим атрибут x:Name=»genderFilter», а для TextBox атрибут x:Name=»nameFilter», для ListView – x:Name=»userList». Так же для элемента Button создадим обработчик события на активность Click.

Обработчик события на активность Click

XAML — разметка, полный код:

   Мужской Женский   "/> "/> "/> "/>    

Пишем алгоритм поиска и фильтрации.

В первую очередь создадим класс объектов, хранящий в себе такие переменные как name, dataOfBirth, age, gender и реализуем функцию, отвечающую за заполнение этих данных:

public class User < public string name < get; set; >public string dataOfBirth < get; set; >public string age < get; set; >public string gender < get; set; >public User(string _name, string _dataOfBirth, string _age, string _gender) < this.name = _name; this.dataOfBirth = _dataOfBirth; this.age = _age; this.gender = _gender; >>

Сразу же создадим массив этого класса, предполагая что у нас будет несколько значений.

public List user = new List();

Далее, необходимо создать функцию LoadUser, принимающую в качестве аргумента массив класса User и вызвать её после инициализации компонентов, отправив созданный массив класса user.

public void LoadUser(List _user) < userList.Items.Clear(); // очищаем лист с элементами for (int i = 0; i < _user.Count; i++) // перебираем элементы < userList.Items.Add(_user[i]); // добавляем элементы в ListBox >>

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

Вызовем эту функцию в после инициализации компонентов формы, чтобы сразу же отобразить имеющиеся данные. Стоп! А какие данные мы собрались отображать? Которых нет?

Добавим эти самые данные.

Перед выполнением функции пропишем добавление данных:

public MainWindow() < InitializeComponent(); // Добавляем данные user.Add(new User("Каримов А.О.", "27.04.1996", "23", "M")); user.Add(new User("Шишкин К.А.", "25.02.1998", "21", "M")); user.Add(new User("Кучукбаева Л.А.", "18.02.1999", "20", "F")); user.Add(new User("Белов А.В.", "25.02.1997", "22", "M")); user.Add(new User("Хоробрых Г.Д.", "25.02.1996", "23", "M")); user.Add(new User("Юкович Н.Т.", "25.02.1995", "22", "M")); user.Add(new User("Власов А.А.", "25.02.1994", "25", "M")); user.Add(new User("Теплоухов Н.С.", "25.02.1993", "26", "M")); LoadUser(user); // выводим данные на экран >

Запустив программу, можно увидеть что все данные благополучно вывелись на экран программы:

Результат выполнения программы реализации алгоритма поиска

Чтож, добавим в элемент ComboBox, два TextBlock’a, задав значения Мужской и Женский на XAML-разметке.

Два TextBlock в элементе ComboBox

Следующим шагом реализовываем функцию фильтрации по признаку пола: для этого необходимо создать новый массив класса User. А далее в зависимости от выбранного значения произвести поиск в массиве с определённым условием:

private void ActiveFilter(object sender, RoutedEventArgs e) < ListnewUsers = new List(); newUsers = user; if (genderFilter.SelectedIndex == 0) newUsers = user.FindAll(x =>x.gender == "M"); else newUsers = user.FindAll(x => x.gender == "F"); LoadUser(newUsers); >

Функция работает следующим образом: если у нас выбран мужской пол, то из всего массива класса будут отобраны только те элементы, которые в качестве значения gender принимают «М». Если же пол женский — соответственно будут выбраны только записи с женским полом. Если же не выбрано ни чего, то будут отображены все записи.

После сортировки по половому фильтру необходимо добавить алгоритм кода, позволяющий производить точное совпадение, со строкой находящейся в TextBox:

newUsers = newUsers.FindAll(x => x.name.Contains(nameFilter.Text));

Contains — этот метод позволяет производить совпадение в записи числа, с каким-то конкретным значением.

Если запустить программу то, можно заметить, что фильтр по половому признаку работает. Точно также как и поиск по совпадениям.

Похожие публикации:

  1. Tf2 lithium grease для чего используется
  2. Как очистить двумерный массив c
  3. Почему в некоторых шрифтах ноль перечеркивается наискось
  4. Что должен знать android junior

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *