Как выполнить фильтрацию в представлении списка C#
В настоящее время я работаю над домашним проектом. В основном у меня есть список, который используется для загрузки данных из базы данных. Это прекрасно работает, данные загружаются в список, и из этого списка я могу заполнить элемент управления представлением списка.
Теперь я пытаюсь создать фильтр, который будет просто фильтровать представление списка на основе ввода пользователя в текстовое поле. Так что у меня есть представление списка:
Имя Фамилия Адрес
Том Нах 1
Керртт Нах 2
Роберт Делл 3
Как это сделать, чтобы любой пользователь вводил в текстовое поле и нажимал событие кнопки, оно будет фильтровать весь список и на основе пользовательского ввода возвращать только те элементы, которые они искали. Например, если они ищут фамилию "нах", то отобразится весь ряд Тома и Керри, потому что они оба содержат фамилию "нах"
Примечание: существует 3 текстовых поля, каждое из которых используется для определенной строки. Итак, txtName, txtSurname и txtAddress.
Что я уже пробовал:
Я пытался фильтровать подобные схемы:
private List FilterPeople() { List filteredPeople = new List(); string Name= txtName.Text.ToLower(); string Surname= txtSurname.Text.ToLower(); string Address = txtAddress.Text.ToLower(); listView.Items.Clear(); foreach (var person in _people) //_people is the list that is getting the //data from the database. { if (!string.IsNullOrEmpty(Name) || !string.IsNullOrEmpty(Surname) || !string.IsNullOrEmpty(Address)) { if ((!person.Name.ToLower().Contains(Name)) || (!person.Surname.ToLower().Contains(Surname)) || (!person.Address .ToLower().Contains(Address))) { continue; } } filteredPeople.Add(person); } return filteredPeople; }
Проблема в том, что filteredPeople всегда равен 0. Он действительно нажимал "continiue" всякий раз, когда я ставил на него точку останова, и, похоже, он нашел фамилию "Nah". Но по какой-то причине я не знаю, что это такое-возвращать 0 в filteredPeople.
Это моя кнопка click event:
private void btnApplyFilters_Click(object sender, EventArgs e) { foreach (var person in FilterPeople()) { AddToListView(person); } }
Добавить в список метод просмотра:
private void AddItemToListView(Person person) { ListViewItem lv = new ListViewItem(person.Name); lv.SubItems.Add(person.Surname); lv.SubItems.Add(person.Address); lvLog.Items.Add(lv); }
Любая помощь будет оценена по достоинству.
Спасибо
Richard MacCutchan
Вы должны фильтровать данные, которые Вы читаете из базы данных, поэтому вы начинаете с правильного списка людей.
fellanmorgh
Я есть, _people используется для его фильтрации. И если, например, имя найдено, он добавит этого конкретного человека в новый список, который затем должен отображать всех фильтрующих людей на основе ввода текстового поля.
Richard MacCutchan
Почему ты все так усложняешь? Используйте элементы из текстовых полей для изменения запроса, отправляемого в базу данных. Затем вы получите автоматически отфильтрованный список, который вы можете немедленно отобразить пользователю.
Kenneth Haugland
WPF WinForms, что ли?
fellanmorgh
WinForms
fellanmorgh
Не берите в голову. Нашел решение этой проблемы.