我知道这里有一个关于在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!“)”并输入了正确的输入,那么它会显示它已找到该项目,但如果我输入的输入不正确,它将不会执行任何操作。 知道如何直接搜索子项吗?感谢。
答案 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来查找条目在值内的结果,例如在句子中。
编辑:肯在他评论中的链接是另一种选择。