我正在尝试为我的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不适合我,我不认为这是一个很好的算法。
你能帮帮我吗?感谢答案 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");
}