我正在使用绑定到WPF DataGrid的ObservableCollection,该集合包含自定义类的实例(约500),自定义类是相对基本的(2个字符串,IP和自定义枚举)
我使用以下代码过滤网格(使用所有列),因为文本被输入到文本框中。
private void searchBox_TextChanged(object sender, TextChangedEventArgs e)
{
CollectionViewSource SearchView = new CollectionViewSource();
SearchView.Filter += Search_Filter;
SearchView.Source = HostList;
dataGridMain.ItemsSource = SearchView.View;
}
void Search_Filter(object sender, FilterEventArgs e)
{
if (e.Item != null)
{
Host host = e.Item as Host;
try
{
bool foundInHost = false;
bool foundInIP = false;
bool foundInUser = false;
foundInHost = host.Hostname.ToLower().Contains(searchBox.Text.ToLower());
foundInIP = host.IP.ToString().Contains(searchBox.Text.ToLower());
foundInUser = host.Username.ToString().Contains(searchBox.Text.ToLower());
if (foundInHost || foundInIP || foundInUser)
{
e.Accepted = true;
}
else
{
e.Accepted = false;
}
}
catch (Exception ex)
{
}
}
}
它可以工作,但即使在我闪亮的新款i7笔记本电脑上也需要太长时间。
有人建议更快速地过滤可观察的集合吗?
答案 0 :(得分:2)
所有ToLower和包含的东西都没有帮助,但最直接的解决方案是
bool found = host.Hostname.ToLower().Contains(searchBox.Text.ToLower());
if (!found)
{
found = host.IP.ToString().Contains(searchBox.Text.ToLower());
if (!found)
{
found = host.Username.ToString().Contains(searchBox.Text.ToLower());
}
}
如果其中一个已经是真的,则不需要其他测试。
searchBox.CharacterCasing to Lower也会有所帮助。
并摆脱那个异常吞下(试试)。这是一个非常糟糕的习惯。 至少在应用程序中添加一个错误日志,记录异常,然后吞下。