使用文本框搜索列表视图项目

本文关键字:列表 视图 项目 搜索 文本 | 更新日期: 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");
}