我的程序生成完整的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并检查每个名称,我可以通过单击按钮来更新它,但这不是我想要的。它也不保留选中的复选框,因为它每次都是新生成的列表。
我读到一个“文本更改侦听器”,但是我不确定那是我应该在这里使用的内容...
答案 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
仅适用于简单的场景,但是您很容易因误用它们而陷入麻烦。