当前位置: 首页 > 知识库问答 >
问题:

C#ListView搜索项不带清除列表

章城
2023-03-14

我有一个C#平台上的winform项目。我有listview和textbox,如下图所示。我想根据用户输入的文本值对列表重新排序。

我在这里询问之前研究过,我通常会看到基于删除和重新添加所有单元到listview的解决方案。我不想这样做,因为我的listview有太多带图片的项目,所以删除和重新添加项目会导致listview工作缓慢。

我想要的是,当用户在文本框中输入字符时,以这些字符开头的项目,将这些项目置于列表的顶部,类似于谷歌搜索系统。

我尝试了下面的代码,但这发送列表末尾的项目,即使我选择了索引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);
                }
            }
        }

共有1个答案

束志业
2023-03-14

ListView使用进行排序。Sort()函数,不确定默认行为是什么,但我认为您需要一个自定义比较器。

下面是(ab)使用ListViewItem实现的示例。标签

自定义比较器:

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();
}

在搜索文本框中键入“是”,会将第2项和第4项排序在第1项和第3项前面。

 类似资料:
  • 我正在用C#WPF做一个项目,它包含在一个客户机管理中,在那里我添加了新的客户机,在一个txt文档中有save,我有一个listview,在那里我可以看到所有添加的客户机,但现在我想实现一个delete按钮,在那里我从listview中选择一个客户机,并可以删除它。如果我现在做的正确,如果有人能帮我…,…谢谢。

  • 当我更改ListViewAdapter时,我的项目将无法从ListView中清除,并且我有一些空白条目。 她是我的密码:

  • 当我键入下面的搜索控件时,会出现一个小“X”,当我单击它时,我的过滤器被清除,我的页面重新呈现。这在铬上很好用。但是,它在Edge 17.17134中不起作用,单击“X”不起作用。我怎么才能让它起作用?

  • 是一种设计标准,但有一个缺陷,它的(通常我会将代码放在此处进行搜索而不进行筛选)不被调用。 如果您只想在而不是中执行搜索,则会出现问题。 当查询字符串为空时,而且我不想在用户只是为了键入其他内容而擦除它时进行搜索--只有在故意删除文本筛选时才进行搜索。 我使用的是,因为设计要求始终可见的搜索栏--但即使情况并非如此,也只有当您在第二次单击“X”图标时“图标化”SearchView时才会调用。 最佳

  • 我使用Elasticsearch允许用户输入要搜索的术语。例如,我要搜索以下属性'name': 如果使用以下代码搜索或,我希望返回此文档。 我尝试过做一个bool must和做多个术语,但它似乎只有在整个字符串都匹配的情况下才起作用。 所以我真正想做的是,这个词是否以任何顺序包含两个词。 有人能帮我走上正轨吗?我已经在这上面砸了一段时间了。

  • 我有一门食谱课: 用户可以在搜索框中输入搜索词列表,我想返回匹配所有搜索词的食谱。以下是我到目前为止的代码: 但是,这将返回仅与一个或两个条件匹配的项。例如。如果用户搜索“Chef Jane”和“Donald”,它还会返回来自“Chef Callum”的东西,因为“Donald”标签存在。 如何确保返回的是完全匹配的?