C# 如何搜索listview';在c中使用文本框替换项目#
我有一个listview名称listView1,它包含计算机id和它们的一些信息。所以我想做的是我有一个文本框名称filterbox,当我写一些东西时,它会过滤它,工作正常。我的问题是它只查找第一列,而不是其他列。例如C# 如何搜索listview';在c中使用文本框替换项目#,c#,C#,我有一个listview名称listView1,它包含计算机id和它们的一些信息。所以我想做的是我有一个文本框名称filterbox,当我写一些东西时,它会过滤它,工作正常。我的问题是它只查找第一列,而不是其他列。例如 PCNAME USER MODEL AAAA JOHN DELL BBBB MIKE TOSHIBA CCCC ASH MONSTER 当我输入BB时,它只得到第二行,它工作正常,但如果我输入戴尔,它什么也得不到 private void fi
PCNAME USER MODEL
AAAA JOHN DELL
BBBB MIKE TOSHIBA
CCCC ASH MONSTER
当我输入BB时,它只得到第二行,它工作正常,但如果我输入戴尔,它什么也得不到
private void filterbox_TextChanged(object sender, EventArgs e)
{
if (filterbox.Text != "")
{
for (int i = listView1.Items.Count - 1; i >= 0; i--)
{
var item = listView1.Items[i];
if (item.Text.ToLower().Contains(filterbox.Text.ToLower()))
{
item.BackColor = SystemColors.Highlight;
item.ForeColor = SystemColors.HighlightText;
}
else
{
listView1.Items.Remove(item);
}
}
if (listView1.SelectedItems.Count == 1)
{
listView1.Focus();
}
}
}
它与迭代子项一样简单:
foreach (ListViewItem item in listView1.Items)
foreach (ListViewItem.ListViewSubItem subitem in item.SubItems)
if (subitem.Text.Equals(filterbox.Text, StringComparison.OrdinalIgnoreCase))
{
item.BackColor = SystemColors.Highlight;
item.ForeColor = SystemColors.HighlightText;
break;
}
注意,您在这里还有其他事情要做,不过我将把细节留给您
更新
对于过滤,您可以使用一些Linq:
if (filterbox.Text == "")
{
return;
}
var list = listView1.Items
.Cast<ListViewItem>()
.Where(
x => x.SubItems
.Cast<ListViewItem.ListViewSubItem>()
.Any(y => y.Text.Contains(filterbox.Text)))
.ToArray();
listView1.Items.Clear();
listView1.Items.AddRange(list);
if(filterbox.Text==“”)
{
返回;
}
var list=listView1.Items
.Cast()
.在哪里(
x=>x.SubItems
.Cast()
.Any(y=>y.Text.Contains(filterbox.Text)))
.ToArray();
listView1.Items.Clear();
listView1.Items.AddRange(列表);
您可以将列表视图与数据表绑定。参考在文本框“文本更改/控制离开”事件中,对数据表应用过滤器。这将负责更新列表视图的项目,因为它的数据源绑定到数据表
listView1.ItemsSource = dataTable.DefaultView;
使用下面的查询筛选数据
DataView dv = new DataView(yourDatatable);
dv.RowFilter = "query"; // query example = "id = 10"
如果有帮助,请告诉我。:) Saruman答案的核心非常有效:使用linq将符合条件的所有项目复制到可枚举集合中,清除listview项目,并
AddRange
好的项目
然而,为了得到一个完全有效的解决方案,还需要进行一些修正
第一:我们需要把整套物品存放在某个地方。同类最佳级别变量:
List<ListViewItem> allItems = new List<ListViewItem>();
感谢萨鲁曼,他用必要的演员阵容编写了linq
顺便说一句:我们确实使用了
Cast
而不是of type
,因为我们可以确定类型Cast
快一点。要搜索项目的子项目吗?做吧!从子项[1]开始,因为[0]是项本身对于(int i.`不需要,您可以使用listView1.Items.Where
。直接过滤,无需删除项只需清除/刷新列表视图链接中的答案似乎不会查看子项。Items.Where(i=>i.Any(sub=>sub.subitems)
如OP a text.Contains(searchText)中所示它给出了大量无意义的错误。它给出了一个错误;删除,StringComparison.OrdinalIgnoreCase
将行更改为。Any(y=>y.Text.Contains(filterbox.Text)))
代码工作正常。@TaW你说得对,这是工作,它对每一列都进行过滤,但当我删除字符时还有一个问题,它什么也不给我?从@TaW代码中,它进行过滤,但再次更改文本,它将给出一个空白页确实,答案还不完整。下面是更正的步骤:创建一个类级变量来保存所有项目:List allItems=new List();
。添加项目时填写:allItems.AddRange(listView1.items.Cast());
。并在筛选过程中使用它:var List=allItems.Cast()…
行文件管理器会很好,但ListView(包含锯齿数组)在数据绑定到表方面非常糟糕。
allItems.Clear();
allItems.AddRange(listView1.Items.Cast<ListViewItem>());
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
}