Как искать изображение в listview через searchbox
Проблема возникает в событии text_changed, когда пользователь вводит символ, результирующее изображение принимается только с текстом, в то время как изображение является пустым. После завершения поиска все изображения становятся пустыми, а текст восстанавливается обратно. Здесь поле поиска-это текстовое поле.
using MetroFramework.Forms; using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Windows.Forms; namespace DocumentViewer { public partial class ImageForm : MetroForm { private string[] files = new string[] { }; private TreeForm dialog; private List<string> filePath = new List<string>(); private ListViewItem lstItem; private int index; public ImageForm() { InitializeComponent(); } private void browseButton_Click(object sender, System.EventArgs e) { dialog = new TreeForm(); dialog.FileFilter = "IMG"; if (dialog.ShowDialog() == DialogResult.OK) { try { listView1.Cursor = Cursors.WaitCursor; clear(); searchBox.Enabled = true; files = dialog.SelectedPath; foreach (string temp in files) { Image image = Image.FromFile(temp); Image thumbNail = image.GetThumbnailImage(100, 100, null, new IntPtr()); filePath.Add(Path.GetFileNameWithoutExtension(temp)); imageList1.Images.Add(thumbNail); fileLabel.Text = "Files : " + imageList1.Images.Count; } loadCaption(); listView1.LargeImageList = imageList1; listView1.Cursor = Cursors.Hand; } catch (Exception error) { MessageBox.Show(error.Message); } } } private void loadCaption() { for (int j = 0; j < imageList1.Images.Count; j++) { lstItem = new ListViewItem(); lstItem.ImageIndex = j; lstItem.Text = Path.GetFileNameWithoutExtension(filePath[j]); listView1.Items.Add(lstItem); } } private void clear() { listView1.Clear(); lstItem = null; imageList1.Images.Clear(); fileLabel.ResetText(); pictureBox1.Image = null; searchBox.ResetText(); filePath.Clear(); } private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e) { try { if (e.Item.Checked == true) { index = Array.FindIndex(files, files => files.Contains(e.Item.Text)); pictureBox1.Image = Image.FromFile(files[index]); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void searchBox_TextChanged(object sender, EventArgs e) { listView1.Items.Clear(); foreach (string str in files) { if (str.ToUpper().Contains(searchBox.Text.ToUpper()) == true) { listView1.Items.Add(Path.GetFileName(str)); } } } private void toolStripMenuItem1_Click(object sender, EventArgs e) { listView1.View = View.LargeIcon; } private void toolStripMenuItem2_Click(object sender, EventArgs e) { listView1.View = View.SmallIcon; } } }
Что я уже пробовал:
private void searchBox_TextChanged(object sender, EventArgs e) { listView1.Items.Clear(); foreach (string str in files) { if (str.ToUpper().Contains(searchBox.Text.ToUpper()) == true) { // This assigns only the last image index to the searched image as well as rest of the images listView1.Items.Add(Path.GetFileName(str), lstItem.ImageIndex); } } }