winforms 筛选列表视图中的项目

xxls0lw8  于 2022-11-16  发布在  其他
关注(0)|答案(4)|浏览(164)

我正在尝试使用TextBox筛选ListView中的项目。
我做了一个代码,但是它只能删除列表视图中的项目,不能恢复。下面是我的代码的一个小例子:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    string value = textBox1.Text.ToLower();
    for (int i = listView1.Items.Count - 1; -1 < i; i--)
    {
        if
        (listView1.Items[i].Text.ToLower().StartsWith(value) == false)
        {
            listView1.Items[i].Remove();
        }
    }
}

有没有人有一个关于如何检索已删除的项目的想法?我似乎不能弄清楚〉:..

00jrzges

00jrzges1#

检查以下示例应用程序

using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
public partial class Form1 : Form
{
    // keep list of listview items 
    List<Data> Items = new List<Data>();

    public Form1()
    {
        InitializeComponent();
        // get initial data
        Items = new List<Data>(){
            new Data(){ Id =1, Name ="A"},
            new Data(){ Id =2, Name ="B"},
            new Data(){ Id =3, Name ="C"}
        };

        // adding initial data
        listView1.Items.AddRange(Items.Select(c => new ListViewItem(c.Name)).ToArray());
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        listView1.Items.Clear(); // clear list items before adding 
        // filter the items match with search key and add result to list view 
        listView1.Items.AddRange(Items.Where(i=>string.IsNullOrEmpty(textBox1.Text)||i.Name.StartsWith(textBox1.Text))
            .Select(c => new ListViewItem(c.Name)).ToArray());
    }

}

class Data
{
    public int Id { get; set; }
    public string Name { get; set; }
}
brqmpdu1

brqmpdu12#

您可以更改逻辑,首先搜索要删除的项目,然后删除它们。

IList<Object> itemsToDelete = new List<Object>( listView1.find(delegate(string text){
     return !text.ToLower().StartsWith(value);
}));

listView1.Remove(itemsToDelete);
return itemsToDelete;

但是你必须返回另一个列表。当你从原始列表中删除项目时,你不能恢复它。你必须将它存储在另一个列表中。

polkgigr

polkgigr3#

listBox1.Items.AddRange(listBox1.Items.Cast<String>    ().Where(X=>X.StartsWith(textBox1.Text)).ToArray());

Link
与ListView的工作方式相同。
希望能有所帮助

yeotifhr

yeotifhr4#

在尝试找到解决方案并放弃搜索后,我创建了这个简单的方法,它对我很有效。

public static void FilterList(ListView list, string text)
    {
        if (text.Length > 0)
        {
            foreach (ListViewItem item in list.Items)
            {
                if (!item.ToString().ToLower().Contains(text.ToLower()))
                {
                    list.Items.Remove(item);
                }
            }
        }
        else 
        {
            UpdateList(list);
        }
    }

相关问题