实时过滤ListView中的项目

时间:2018-08-16 21:49:14

标签: c# winforms listview

我的程序生成完整的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);
    }
}

getList()仅返回我想要的所有名称中的List<string>

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

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

2 个答案:

答案 0 :(得分:2)

通过过滤,您需要某种方式来记住选择了哪些ListViewItem,因此,您想要在主列表中实例化它们,而不是将所有ListViewItem插入到列表视图中。然后将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();
}

在您直接处理masterlist中的ListViewItem时,它们在交换进listView1中时将保持其选中状态。

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

答案 1 :(得分:-1)

如果您想使用完整的C#解决方案(而不是使用任何Javascript),请尽我所能,我建议使用UpdatePanel

ListBox放在<ContentTemplate>的{​​{1}}部分中,然后添加一个<UpdatePanel>设置为文本框的<asp:AsyncPostBackTrigger>。确保将ControlID的{​​{1}}属性设置为“有条件”。

您还必须在UpdateMode上将UpdatePanel属性设置为TextBox。在AutoPostBack本身上,您将必须创建一个true事件处理程序,然后在{TextBox文件后面的代码中,您将拥有TextChanged处理程序的逻辑过滤列表,然后为您的TextChanged设置新值。

.cs仅适用于简单的场景,但是您很容易因误用它们而陷入麻烦。