[英]C# ListView search item without clear list
我在 C# 平台上有 winform 项目。 我有列表视图和文本框,如下图所示。 我想根据用户输入的文本值对列表进行重新排序。
我在这里问之前进行了研究,我通常看到基于将所有单元再次删除并重新添加到列表视图的解决方案。 我不想这样做,因为我的列表视图有太多带有图片的项目,因此删除和重新添加项目会导致列表视图工作缓慢。
我想要的是,当用户在文本框中输入字符时,以这个字符开头的项目,把这个项目放在列表的顶部,类似于谷歌搜索系统。
我尝试了下面的代码,但是即使我选择了索引 0,这也会将项目发送到列表的末尾。谢谢。
private void txt_search_TextChanged(object sender, EventArgs e)
{
string text = txt_search.Text;
var item = listView1.FindItemWithText(text);
if (item != null)
{
int index = listView1.Items.IndexOf(item);
if (index > 0)
{
listView1.Items.RemoveAt(index);
listView1.Items.Insert(0, item);
}
}
}
ListView
使用.Sort()
function 进行排序,不确定默认行为是什么,但我认为您需要一个自定义比较器。
这是(ab)使用ListViewItem.Tag
的示例实现。
自定义比较器:
private class SearchCompare : Comparer<ListViewItem>
{
public override int Compare([AllowNull] ListViewItem x, [AllowNull] ListViewItem y)
{
if (x?.Tag != null && y?.Tag != null)
{
return x.Tag.ToString().CompareTo(y.Tag.ToString());
}
return 0;
}
}
初始化ListView
:
var items = new[]
{
"1 no",
"2 yes",
"3 no",
"4 yes"
};
foreach (var item in items)
{
listView1.Items.Add(item);
}
listView1.ListViewItemSorter = new SearchCompare(); // custom sorting
当然,文本更改事件处理程序:
private void textBox1_TextChanged(object sender, EventArgs e)
{
string text = textBox1.Text;
foreach (ListViewItem item in listView1.Items)
{
if (item.Text.IndexOf(text, StringComparison.InvariantCultureIgnoreCase) > -1)
{
item.Tag = "a"; // a is sorted before b
}
else
{
item.Tag = "b"; // b is sorted after a
}
}
listView1.Sort();
}
在搜索文本框中键入“yes”会将项目 2 和 4 排在项目 1 和 3 的前面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.