在列表视图中搜索子项

本文关键字:搜索 列表 视图 | 更新日期: 2023-09-27 18:34:16

我知道这里已经有一个关于在列表视图中搜索子项的问题,但对于像我这样的新手来说有点复杂。我做了一个简单的窗口表单应用程序,其中包含列表视图,在列表视图中有 2 列命名:"名称"和"年龄"。我设法搜索子项目,但它首先搜索第一列中的项目,然后搜索子项目。代码如下:

private void btnSearch_Click(object sender, EventArgs e)
{
    for (int i = 0; i <=listView1.Items.Count-1; i++) 
        {
            foreach(ListViewItem.ListViewSubItem subitem in listView1.Items[i].SubItems)
            {
                if (subitem.Text.Equals(txtSearch.Text))
                {
                    MessageBox.Show("Subitem found!");
                }
                else
                {
                    MessageBox.Show("Subitem not found!");
                }
            }
        }
}

(在列表视图中使用名字:"John"和年龄:"17"(

输入:

txt搜索: 17

输出:

找不到子项!//因为它在第一列中首先搜索(这是约翰(

找到子项!//因为它现在检测到子项

如果我删除"MessageBox.Show("找不到子项!"("并输入正确的输入,它当然会显示它已找到该项目,但如果我输入不正确的输入,它不会做任何事情。知道如何直接搜索子项吗?谢谢。

在列表视图中搜索子项

有几种方法可以解决这个问题,第一种(长手(是对当前方法的轻微更改。

private void btnSearch_Click(object sender, EventArgs e)
{
    var isResultFound = false;
    for (int i = 0; i <=listView1.Items.Count-1; i++) 
    {
        foreach(ListViewItem.ListViewSubItem subitem in listView1.Items[i].SubItems)
        {
            if (subitem.Text.Contains(txtSearch.Text))
            {
                isResultFound = true;
                break;
            }
        }
        if(isResultFound) break;
    }
    if(isItemFound)
    {
         MessageBox.Show("Found!");
    }
    else
    {
         MessageBox.Show("Not found!");
    } 

另一种方法是使用 Linq 查询项目。

private void btnSearch_Click(object sender, EventArgs e)
{
    var isResultFound =  listView1.Items.Any(i=>
               i.SubItems.Any(si=>
                   si.Text.Contains(txtSearch.Text)));
    if(isItemFound)
    {
         MessageBox.Show("Found!");
    }
    else
    {
         MessageBox.Show("Not found!");
    } 

这个新的 Linq 表达式实际上与 for 循环执行相同的操作,只是方式更简洁。

这两个示例都将在找到搜索值的第一次出现后停止循环迭代。

我还使用"包含"选项而不是"等于"来查找条目在值内的结果,例如在句子中。


编辑:Ken评论中的链接是您可以使用的另一种选择。