使用文本框

时间:2016-01-04 11:25:29

标签: c# .net listview search

我正在尝试为我的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"所以现在我的搜索框只有#34;剑" ,它不会告诉我所有的剑#34;纹理,因为我已经从我的listview中删除了它们,所以我必须从searchBox中删除所有内容,以便刷新。 我想尝试隐藏项目,存储隐藏项目的信息,并在每个步骤删除一个字母以显示它们。不幸的是,item.Visible不适合我,我不认为这是一个很好的算法。

你能帮帮我吗?感谢

2 个答案:

答案 0 :(得分:2)

您应该使用ListView显示搜索结果,而不是存储原始数据。

要存储原始数据,请将它们放在某个集合中,例如实例变量中的List<string>

每次搜索时,都可以使用LINQ过滤数据,然后将结果放入ListView。

以下是一个例子:

假设您将数据存储在某个实例变量data中:

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

然后您将使用results填充列表视图。

这样,data将始终包含原始数据(未过滤)。对于每次搜索,您只需计算一个新数据集以在ListView中显示它。

答案 1 :(得分: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");
}