Фильтрация слов в элементах списка по текстовому полю

1

У меня есть ListView с элементами, и я хочу создать фильтр, который покажет мне только элементы, содержащие слово, написанное в TextBox. Я пытался:

bool containsAnyLetter = textBox2.Text.IndexOfAny(letters) >= 0;

Что код для заполнения ListView:

private void button1_Click_1(object sender, EventArgs e)
{
    listView1.Items.Clear();
    listView2.Items.Clear();
    int places, count;
    string keyword, site;
    count = 1;
    keyword = keywords.Text;
    site = sites.Text;
    places = Convert.ToInt32(textBox1.Text);
    var client = new GwebSearchClient("http://www.google.com");
    var results = client.Search(keyword, places);
    foreach (var webResult in results)
    {
        ListViewItem item = listView1.Items.Add(count++ + "  " + webResult.ToString());

        item.SubItems.Add(string.Empty);            

        ListViewItem itemz = listView2.Items.Add(webResult.Url.ToString());
        listView1.FullRowSelect = true;
    }
}

Теперь я хочу сделать что-то подобное, но он должен обменивать текущие элементы списка, только то, что содержит слово в TextBox.

if (listView2.Items.ToString().Contains(textBox2.Text))
{
    //the should exchange the listview items for a that one which contains a word from a textbox.
}

Но, похоже, это плохо работает. Есть ли другой способ найти и показать элементы, содержащие слово в TextBox?

Теги:
filter
listview

2 ответа

3

Другим способом сделать это было бы включение элементов ListView в IEnumerable и использование Linq для выполнения запроса.

IEnumerable<ListViewItem> lv = listViewItems.Items.Cast<ListViewItem>();

var matchingItems = lv.Where(i => i.Text.Contains(textBoxCriteria.Text));
  • 0
    +1 за использование Linq: D
1

Вы можете перемещаться по Listbox и проверять, содержит ли элемент это слово, но вы не можете скрыть элемент, потому что ListBox не может этого сделать. У вас есть выбор:
1. Скройте фактический ListBox и создайте новый в том же месте ИЛИ
2. Используйте WPF.
Используйте этот код, чтобы проверить, содержит ли элемент текст в текстовом поле:

foreach (var listBoxItem in listBox1.Items)
{
    if(listBoxItem.ToString().Contains(txtBox.Text))
    {
        //Item contains word, do something
    }
}
  • 0
    Вы бы создали совершенно новый элемент управления, чтобы отображать отфильтрованные элементы из первого элемента управления? И как конкретно WPF может решить проблему?
  • 0
    Что ж, проще скрыть фактический ListBox и показать отфильтрованную версию мгновенного удаления каждого элемента и поместить их обратно в тот же индекс. В WPF я бы построил простой ListBox, который может скрывать и показывать элементы и реализовывать его через WpfHost управления WpfHost

Ещё вопросы

Сообщество Overcoder
Наверх
Меню