实时过滤 ListView 中的项目

coi*_*ird 3 c# listview winforms

我的程序生成充满信息的ListView。我在文本框中键入一个可能与 ListView 中的项目名称之一匹配的名称。我希望这个输入的名称能够从 ListView 中清除不匹配的名称。

例如,如果我输入“abc”,“uvw”和“xyz”等名称将不再显示,但“abc”和“abcde”仍会显示在列表视图中。

最终目标是能够选中我想要的名称旁边的复选框,并搜索更多名称,最终选择几个名称,而无需重置复选框。

现在我单击一个按钮并填充 ListView:

private void button1_Click(object sender, EventArgs e)
{
    List<string> myList = getList();
    foreach(string s in myList)
    {
        listView1.Items.Add(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

getList()只返回List<string>我想要的所有名称中的一个。

当我在文本框中输入内容时,我不知道如何使 ListView 实时更新。我可以通过基于循环列表并检查每个名称来重新填充 ListView 来单击按钮来更新它,但这不是我想要的。它也不保留选中的复选框,因为它每次都是新生成的列表。

我读到了有关“文本更改侦听器”的内容,但我不确定这就是我应该在这里使用的......

Han*_*rab 6

通过过滤,您需要某种方式来记住选择了哪些 ListViewItems,因此您不想将所有 ListViewItems 插入到列表视图中,而是希望在主列表中实例化它们。然后将 TextChanged 事件处理程序附加到文本框,当文本更改时,您将显示项目。

List<ListViewItem> masterlist;

public Form1()
{
    InitializeComponent();
    masterlist = new List<ListViewItem>();
}

private void button1_Click(object sender, EventArgs e)
{
    // Populate the masterlist
    masterlist.Clear();
    foreach(string s in getList())
    {
        masterlist.Items.Add(new ListViewItem(s));
    }

    // Display the items in the listview
    DisplayItems();
}

private void DisplayItems()
{
    listView1.Items.Clear();

    // This filters and adds your filtered items to listView1
    foreach(ListViewItem item in masterlist.Where(lvi => lvi.Text.ToLower().Contains(textBox1.Text.ToLower().Trim())))
    {
        listView1.Items.Add(item);
    }
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
    // Re-display the items when the filter changes
    DisplayItems();
}
Run Code Online (Sandbox Code Playgroud)

当您直接处理 ListViewItems 时,masterlist它们在换入和换出时将保留其选中状态listView1

我假设您的过滤器文本框名为textBox1.