2013-05-14 2 views
3

Я пытаюсь фильтровать элементы в ListView с помощью TextBox.
Мне удалось что-то сделать, но он может удалять только элементы из моего списка, а не возвращать их. Вот небольшой пример моего кода:Фильтрация элементов в Listview

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    string value = textBox1.Text.ToLower(); 
    for (int i = listView1.Items.Count - 1; -1 < i; i--) 
    { 
     if 
     (listView1.Items[i].Text.ToLower().StartsWith(value) == false) 
     { 
      listView1.Items[i].Remove(); 
     } 
    } 
} 

У кого-нибудь есть идея о том, как получить удаленные предметы? Я не могу понять его>: ...

+2

Вы не можете. «Элементы» - обычная коллекция; как только вы удалите предметы, они исчезнут. Вам нужно будет хранить удаленные элементы где-нибудь (возможно, в другой коллекции), если вы хотите их восстановить позже. –

+0

Как вы связываете ListView? можете ли вы обновить код, связанный с привязкой данных? – Damith

ответ

10

проверка ниже образец приложения

using System; 
using System.Windows.Forms; 
using System.Collections.Generic; 
using System.Linq; 
public partial class Form1 : Form 
{ 
    // keep list of listview items 
    List<Data> Items = new List<Data>(); 

    public Form1() 
    { 
     InitializeComponent(); 
     // get initial data 
     Items = new List<Data>(){ 
      new Data(){ Id =1, Name ="A"}, 
      new Data(){ Id =2, Name ="B"}, 
      new Data(){ Id =3, Name ="C"} 
     }; 

     // adding initial data 
     listView1.Items.AddRange(Items.Select(c => new ListViewItem(c.Name)).ToArray()); 
    } 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     listView1.Items.Clear(); // clear list items before adding 
     // filter the items match with search key and add result to list view 
     listView1.Items.AddRange(Items.Where(i=>string.IsNullOrEmpty(textBox1.Text)||i.Name.StartsWith(textBox1.Text)) 
      .Select(c => new ListViewItem(c.Name)).ToArray()); 
    } 

} 

class Data 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 
+7

Стена с кодом, без объяснения того, что она делает. –

+1

@RobertHarvey Я добавил несколько встроенных комментариев, но даже OP не отвечает на вопросы, которые я задаю комментариями. – Damith

+0

Это работает отлично! Спасибо :). Мне пришлось немного изменить, потому что у меня уже был список, но это так же просто, как сказать спасибо :). –

0
listBox1.Items.AddRange(listBox1.Items.Cast<String> ().Where(X=>X.StartsWith(textBox1.Text)).ToArray()); 

Link

работает так же, как с ListView.

Надеется, что это помогает

+0

Я изменил код на: ' listView1.Items.AddRange (listView1.Items.Cast () .Where (X => X.StartsWith (textBox1.Text)). ToArray()) ;, но я получаю сообщение об ошибке: (screenshot) -> http://puu.sh/2TpSG.png –

+0

ListViewItem [] list = listView1.Where (X => X.StartsWith (textBox1.Text)). ToArray(); Теперь очистите список и назначьте новый список списку: listView1.Items.Clear(); listView1 = список; – AAlferez

2

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

IList<Object> itemsToDelete = new List<Object>(listView1.find(delegate(string text){ 
    return !text.ToLower().StartsWith(value); 
})); 

listView1.Remove(itemsToDelete); 
return itemsToDelete; 

Но вы должны вернуть другой список. Когда вы удаляете элементы из исходного списка, вы не можете его восстановить. Вы должны сохранить его в другом списке.

Смежные вопросы