我有一个列表视图,其中包含数据库中的多个项目,并且我有一个搜索框,可以根据在搜索框中键入的字符过滤此列表视图。
这一切都很好,并且是使用“TaW”链接的帮助完成的:How to search listview's items with textbox in c#
首先:我已将完整的项目集存储在类级别变量中:
List<ListViewItem> allItems = new List<ListViewItem>();
然后我在添加全套项目后填写了它:
allItems.Clear();
allItems.AddRange(listView1.Items.Cast<ListViewItem>());
然后我编写了filterTextbox的TextChanged事件;这里我总是使用全套数据:
private void filterbox_TextChanged(object sender, EventArgs e)
{
listView1.Items.Clear(); // clear all items we have atm
if (filterbox.Text == "")
{
listView1.Items.AddRange(allItems.ToArray()); // no filter: add all items
return;
}
// now we find all items that have a suitable text in any subitem/field/column
var list = allItems.Cast<ListViewItem>()
.Where( x => x.SubItems
.Cast<ListViewItem.ListViewSubItem>()
.Any(y => y.Text.Contains(filterbox.Text)))
.ToArray();
listView1.Items.AddRange(list); // now we add the result
}
但是我注意到这将大写和小写视为单独的事物,因此如果我搜索“Web”,它将过滤所有带有“Web”一词的条目,但不会过滤那些带有“WEB”或“web”的条目。
我怎样才能做到这一点,这样它就可以根据字母而不是大小写来工作,因为我不在乎。 我希望过滤我的列表,以便它显示所有 3 个条目 -“Web”、“WEB”和“web”?
我觉得我需要某种转换“ToUpper”或“ToLower”,但我不确定将其放在我的代码中的哪里。
谢谢你,
要使您的搜索过滤器不区分大小写,您可以修改现有代码,将搜索文本和
ListView
项目中的文本转换为小写或大写,然后再进行比较。具体方法如下:
private void filterbox_TextChanged(object sender, EventArgs e)
{
listView1.Items.Clear(); // clear all items we have atm
if (string.IsNullOrEmpty(filterbox.Text))
{
listView1.Items.AddRange(allItems.ToArray()); // no filter: add all items
return;
}
// Convert the search text to lowercase (or uppercase) for case-insensitive comparison
string searchText = filterbox.Text.ToLower(); // or .ToUpper() if you prefer
// Now we find all items that have suitable text in any subitem/field/column
var list = allItems.Cast<ListViewItem>()
.Where(x => x.SubItems
.Cast<ListViewItem.ListViewSubItem>()
.Any(y => y.Text.ToLower().Contains(searchText))) // or .ToUpper()
.ToArray();
listView1.Items.AddRange(list); // now we add the result
}
在此修改后的代码中,我们将搜索文本 (searchText) 和
ListView
项目中的文本转换为小写 (或大写),然后再进行比较。这样,搜索将不区分大小写,并且无论字母大小写如何,它都会匹配项目。您可以根据您的喜好选择 .ToLower()
或 .ToUpper()
。