我正在编写一个过滤器来挑选物品。我有一个对象列表。对象包含数字,名称和一些其他不相关的项目。目前,该列表包含200个项目。在textbox
中键入时,我正在查找字符串是否与列表中对象的数字/名称的一部分匹配。如果是,请将其添加到listbox
。这是我的textbox textchanged事件的代码:
private void txtTelnumber_TextChanged(object sender, TextChangedEventArgs e)
{
lstOverview.Items.Clear();
string data = "";
foreach (ucTelListItem telList in _allUsers)
{
data = telList.User.H323 + telList.user.E164;
if (data.Contains(txtTelnumber.Text))
lstOverview.Items.Add(telList);
}
}
我有时会在输入字符时看到一点延迟,特别是当我从4条记录转到200条记录时(所以当我有一个过滤器和4条记录匹配时,我退格并且整个列表再次出现)。 我的列表是一个用户控件列表,因为我发现从列表加载用户控件所需的时间更少,然后每次都必须初始化一个新的用户控件。
我可以对代码执行某些操作,还是仅添加导致小延迟的usercontrol
listbox
(小延迟= <1秒)?
提前致谢。
修改的 我编辑了帖子,这是wpf。将项目放在列表中并设置itemssource并不能解决问题。
答案 0 :(得分:2)
我建议您使用两种技巧:
ListBox
添加项目之前,请调用BeginUpdate()
方法,并在完成添加项目后调用其EndUpdate()
。这些方法专门用于避免在大量插入项目期间丢失性能。KeyUp
的上一次TextBox
事件发生后经过一段特定时间后启动过滤任务。通过这种方式,您可以增加不评估对用户来说不重要的过滤器的机会。答案 1 :(得分:1)
我刚才弄清楚是什么原因造成了将物品装入我的列表框的延迟。我正在使用预定义的主题(Wpf主题),因为我的列表框全部是拉皮条的,重绘需要更长的时间。因此它与编程逻辑无关,只是样式延迟了我的过滤器。
答案 2 :(得分:0)
使用BeginUpdate / EndUpdate包装代码,以便在添加项目时停止重绘。
private void txtTelnumber_TextChanged(object sender, TextChangedEventArgs e)
{
lstOverview.BeginUpdate();
lstOverview.Items.Clear();
string data = "";
foreach (ucTelListItem telList in _allUsers)
{
data = telList.User.H323 + telList.user.E164;
if (data.Contains(txtTelnumber.Text))
lstOverview.Items.Add(telList);
}
lstOverview.EndUpdate();
}
答案 3 :(得分:0)
private void txtTelnumber_TextChanged(object sender, TextChangedEventArgs e)
{
lstOverview.DataSource=_allUsers.FindAll(delegate(ObjType telList)
{
return (telList.User.H323.Contains(txtTelnumber.Text) || telList.user.E164.Contains(txtTelnumber.Text) );
});
}
尝试以上代码
答案 4 :(得分:0)
你只有200件物品???在WPF中,您不应该遇到性能上的任何延迟。只需将您的数据填充到ObservableCollection中,然后将其绑定到listview。现在在textchanged事件中,您可以将相同的过滤器逻辑应用于ObservableCollection而不是listview。列表视图应该立即反映出这些变化。
我正在处理数百万条记录而没有任何延迟。
您永远不想创建延迟
另请查看VirtualMode property进行高级操作。
<强>更新强>
似乎你在每个textchanged事件中都在执行此操作data = telList.User.H323 + telList.user.E164;
。您可以事先更好地创建List<data>
并在循环中仅实现过滤器逻辑。
答案 5 :(得分:0)
您必须首先使用lambda从列表中获取所有相关项目,然后尝试使用AddRange将项目添加到列表框中。