2016-01-04 5 views
0

Я пытаюсь сделать окно поиска для моей ListView, и мне удалось сделать алгоритм, который работает, но не идеально:элементы Поиск ListView с помощью текстового поля

if (!string.IsNullOrWhiteSpace(searchBox.Text)) 
{ 
    foreach (ListViewItem item in textureViewer.Items) 
    { 
     if (!item.Text.ToLower().Contains(searchBox.Text.ToLower())) 
      textureViewer.Items.Remove(item); 
    } 
    if (textureViewer.SelectedItems.Count == 1) 
    { 
     textureViewer.Focus(); 
    } 
} 
else 
    LoadTextures(); 

До сих пор он работает, я могу найти и они отображаются хорошо, но, например, если я ищу «sword_diamond», а затем удаляю «_diamond», так что теперь у меня в моем поискеБокс только «меч», он не покажет мне все текстуры «меч», потому что у меня есть уже удалили их из моего списка, поэтому мне придется удалить все из поиска, чтобы он обновился. Я хотел попытаться скрыть элементы, сохранить информацию о том, какие элементы спрятаны, и на каждом шаге, когда письмо удаляется, чтобы они отображались. К сожалению, item.Visible недоступен для меня, и я не думаю, что это был бы хороший алгоритм.

Вы можете мне помочь? Благодаря

+0

Каков исходный источник данных? Вы удаляете элементы из списка ListView для удаления элементов, которые не соответствуют поиску? –

+0

Да, я удаляю элементы, которые не совпадают с поиском. Мои элементы сделаны из изображения и имени, все изображения хранятся в ImageList –

+0

Но каков исходный источник данных? Это из файла? или базы данных? Или это данные в памяти, которые пользователь только что ввел? –

ответ

2

Вы должны использовать ListView для отображения результатов поиска, а не хранить исходные данные.

Чтобы сохранить исходные данные, поместите их в некоторую коллекцию, например List<string> в переменную экземпляра.

И каждый раз, когда вы выполняете поиск, вы можете использовать LINQ для фильтрации данных, а затем вы можете поместить результаты в ListView.

Вот пример:

Предполагая, что вы храните данные в некотором случае переменной data:

var results = data.Where(x => x.Contains("sword")).ToList(); 

И тогда вы будете использовать results для заполнения списка.

Таким образом, data всегда будет содержать исходные данные (нефильтрованные). И для каждого поиска вы вычисляете новый набор данных, чтобы отображать его в ListView.

+0

Да, я забыл сказать, что фотографии хранятся в списке , и я использую listview, чтобы показать их, это может быть то, что я ищу, спасибо! –

+0

Я СДЕЛАЛ! Он работает ОТЛИЧНО, еще раз спасибо: D –

0

Сохранить список вы изображений в поле на форме, а затем использовать его для фильтрации, как этот

private IEnumerable<string> textures; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    this.textures = LoadTextures(); 
} 

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    if (!string.IsNullOrWhiteSpace(textBox1.Text)) 
    { 
     FillListView(item => item.ToLower().Contains(textBox1.Text.ToLower())); 

     if (listView1.SelectedItems.Count == 1) 
      listView1.Focus(); 
    } 
    else 
     FillListView(); 
} 

private void FillListView(Func<string, bool> filter = null) 
{ 
    listView1.Items.Clear(); 
    var items = filter == null ? this.textures : this.textures.Where(filter); 
    foreach (var item in items) 
     listView1.Items.Add(item); 
} 

private IEnumerable<string> LoadTextures() 
{ 
    return Directory.GetFiles("path", "*.png"); 
} 
Смежные вопросы