在listview中搜索子项目

时间:2016-02-11 14:21:42

标签: c#

我知道这里有一个关于在listview中搜索子项目的问题,但对于像我这样的新手来说这有点复杂。我做了一个带有listview的简单windows窗体应用程序,在listview里面有两列名为:'Name'和'Age'。我设法搜索子项目,但它首先搜索第一列中的项目,然后搜索子项目。这是代码:

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')

输入:

  

txtSearch:17

输出:

  

未找到子项目! //因为它首先在第一列(约翰)中搜索

     

Subitem发现了! //因为它现在检测到了子项目

如果我删除了“MessageBox.Show(”Subitem not found!“)”并输入了正确的输入,那么它会显示它已找到该项目,但如果我输入的输入不正确,它将不会执行任何操作。 知道如何直接搜索子项吗?感谢。

1 个答案:

答案 0 :(得分:1)

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

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 Expression实际上和for循环一样,只是以更简洁的方式。

这些示例都会在第一次出现搜索值后停止循环迭代。

我还使用了Contains选项而不是Equals来查找条目在值内的结果,例如在句子中。

编辑:肯在他评论中的链接是另一种选择。