c# - 使用文本框搜索 ListView 项目

标签 c# listview search

我正在用 C# 开发一个简单的应用程序(电话簿),在我的项目中,我有一个充满联系人的 ListView 。我一直在尝试实现使用文本框自动(立即)搜索 ListView 的可能性。我已经设法让它发挥作用,但不是以期望的方式。如果我给你举个例子,你就会意识到实际的问题。假设我有一个名为 Bill Gates 的联系人,当我尝试搜索它时 - 它被找到了,并且该部分没问题。但是,问题是当我尝试搜索另一个联系人时。在这种情况下,我必须在输入另一个名称之前清除文本框,但可以仅逐个字母地删除。当我开始删除整个姓名时,删除第一个字母后,它就像我刚刚输入了姓名一样 - 它选择了该项目(并且也聚焦) - 实际上,在再次找到联系人之前没有时间删除整个姓名。我必须删除第一个字母,然后切换回文本框,删除另一个字母等。是否有任何解决方案可以自动搜索 - 就像现在一样,但另一方面可以在不选择联系人的情况下删除(清除文本框)成为可能。

看一下代码:

private void txt_Search_TextChanged(object sender, System.EventArgs e)
    {
        if (txt_Search.Text != "")
        {
            foreach (ListViewItem item in listView1.Items)
            {
                if (item.Text.ToLower().Contains(txt_Search.Text.ToLower()))
                {
                    item.Selected = true;
                }
                else
                {
                    listView1.Items.Remove(item);
                }

            }
            if (listView1.SelectedItems.Count == 1)
            {
                listView1.Focus();
            }
        }
        else 
        { 
            LoadContacts();
            RefreshAll();
        }
    } 

最佳答案

您的代码中存在一些问题,首先,当在循环中修改集合时,我们不应该使用 foreach 尽管在某些情况下它似乎有效但实际上并非如此,它肯定会将来会很奇怪,让你感到困惑。我们应该使用 for 循环来代替,并以相反的顺序循环。第二个错误是您将 Selected 设置为 true 这可能会导致您的 textBox 失去对 listView 的焦点。解决方案是我们必须使用其他方式来指示该项目已被选中,例如使用 BackColor 代替:

private void txt_Search_TextChanged(object sender, System.EventArgs e)
{
    if (txt_Search.Text != "") {
        for(int i = listView1.Items.Count - 1; i >= 0; i--) {
            var item = listView1.Items[i];
            if (item.Text.ToLower().Contains(txt_Search.Text.ToLower())) {
                item.BackColor = SystemColors.Highlight;
                item.ForeColor = SystemColors.HighlightText;
            }
            else {
                listView1.Items.Remove(item);
            }
        }
        if (listView1.SelectedItems.Count == 1) {
            listView1.Focus();
        }
    }
    else   
        LoadContacts();
        RefreshAll();
    }
}

此外,在用户聚焦ListView之后,所有BackColorForeColor都应该重置,我们可以处理Enter ListView的code>事件:

//Enter event handler for listView1
private void listView1_Enter(object sender, EventArgs e){
  foreach(ListViewItem item in listView1.Items){
    item.BackColor = SystemColors.Window;
    item.ForeColor = SystemColors.WindowText;
  }
}

关于c# - 使用文本框搜索 ListView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20341113/

相关文章:

c# - 我如何在 Visual Studio 中将多线程应用程序调试为单线程

wpf - 连续填充的 ListView 未虚拟化

wpf - 在分组 ListView 中滚动

c# - 如何正确杀死Linux C#

c# - 如何让用户类型 C# 语法突出显示在 VS 2012 RC 中再次工作?

c# - 如何在没有时间的情况下获取当前日期?

java - 删除 ListView 中单击的项目的 ID

algorithm - 搜索算法 : Parsing and processing a request OOP style

java - 实现公共(public)上下文搜索 - 如何处理?

java - 在Java中使用正则表达式进行部分搜索