使用文本框搜索列表视图项目
本文关键字:列表 视图 项目 搜索 文本 | 更新日期: 2023-09-27 18:28:57
我正试图为我的列表视图制作一个搜索框,我设法制作了一个有效但并不完美的算法:
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();
到目前为止,它是有效的,我可以搜索项目,它们显示得很好,但是,例如,如果我搜索"jiang_diamond",然后删除"_diamund",那么现在我的搜索框中只有"剑",它不会显示所有的"剑"纹理,因为我已经从列表视图中删除了它们,所以我必须从搜索框中删除所有内容,这样它才会刷新。我想尝试隐藏这些项目,存储隐藏项目的信息,以及在每一步删除一封信时让它们出现的信息。不幸的是,项目。Visible对我来说不可用,我认为这不是一个好的算法。
你能帮我吗?感谢
您应该使用ListView来显示搜索结果,而不是存储原始数据。
要存储原始数据,请将它们放在某个集合中,例如实例变量中的List<string>
。
每次搜索时,都可以使用LINQ过滤数据,然后将结果放入ListView中。
这里有一个例子:
假设您将数据存储在某个实例变量data
:中
var results = data.Where(x => x.Contains("sword")).ToList();
然后使用results
来填充列表视图。
这样,data
将始终包含原始数据(未经过滤)。对于每个搜索,您计算一个新的数据集,以便在ListView中显示它。
将图像列表保存在表单的字段中,然后使用它进行过滤,就像一样
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");
}