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

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

  • автор:

Поиск в DataGrid 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 — этот метод позволяет производить совпадение в записи числа, с каким-то конкретным значением.

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

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

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