fellanmorgh Ответов: 1

Как выполнить фильтрацию в представлении списка 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

Не берите в голову. Нашел решение этой проблемы.

1 Ответов

Рейтинг:
6

Yuriy Loginov

Попробуйте что-нибудь вроде этого

List filteredPeople = new List();

string Name = txtName.Text.Trim().ToLower();
string Surname = txtSurname.Text.Trim().ToLower();
string Address = txtAddress.Text.Trim().ToLower();

//it would be a good idea to move this line outside this method,
//since filter logic should not have any affect on the actual view
listView.Items.Clear();

foreach (var person in _people) //_people is the list that is getting the
                                //data from the database.
{
    if(!String.IsNullOrEmpty(Name)
       && person.Name.ToLower().Contains(Name))
    {
        filteredPeople.Add(person);
    }
    else if (!String.IsNullOrEmpty(Surname)
             && person.Surname.ToLower().Contains(Surname))
    {
        filteredPeople.Add(person);
    }
    else if (!String.IsNullOrEmpty(Address)
             && person.Address.ToLower().Contains(Address))
    {
        filteredPeople.Add(person);
    }
}

return filteredPeople;