我目前有一個DataGrid
充滿公司,我過濾的基礎上有兩件事 - 一個是搜索框,用戶可以根據公司的名稱,城鎮或郵政編碼進行過濾。這看起來像這樣;過濾和ICollectionView過濾器WPF
通過名稱/鎮過濾/郵編
private void FilterDataGrid()
{
try
{
var searchText = CharactersOnly(searchBox.Text);
CompanyICollectionView.Filter = (obj =>
{
CompanyModel compDetails = obj as CompanyModel;
if (compDetails == null)
{
return true;
}
if (compNameRad.IsChecked == true)
{
return CompanyContains(compDetails.Name, searchText.ToLower());
}
if (compTownRad.IsChecked == true)
{
return CompanyContains(compDetails.Town, searchText.ToLower());
}
if (compPcodeRad.IsChecked == true)
{
return CompanyContains(compDetails.Postcode, searchText.ToLower());
}
return false;
});
if (dataGrid.Items.Count == 0) // There are no companies with this filter on, clear the label
{
compDetailsLabel.Content = string.Empty;
}
else
{
dataGrid.SelectedIndex = 0;
}
}
catch (Exception ex)
{
var hEs = new HandleExceptionService();
hEs.HandleException(ex.ToString());
}
}
用於過濾的第二種方法是基於對本公司的類型。這是通過選擇多個CheckBoxes
完成的。這個方法看起來像這樣;
按公司類型
private void FilterCompanyType(object sender, RoutedEventArgs e)
{
criteria.Clear();
if (currentCheckBox.IsChecked == true && nonCurrentCheckBox.IsChecked == false)
{
criteria.Add(new Predicate<CompanyModel>(x => x.CurrentStatus == 1));
}
else if (nonCurrentCheckBox.IsChecked == true && currentCheckBox.IsChecked == false)
{
criteria.Add(new Predicate<CompanyModel>(x => x.CurrentStatus == 0));
}
else if (nonCurrentCheckBox.IsChecked == true && currentCheckBox.IsChecked == true)
{
criteria.Add(new Predicate<CompanyModel>(x => (x.CurrentStatus == 1 || x.CurrentStatus == 0)));
}
if (subbieCheckBox.IsChecked == true)
{
criteria.Add(new Predicate<CompanyModel>(x => x.Subcontractor == 1));
}
if (supplierCheckBox.IsChecked == true)
{
criteria.Add(new Predicate<CompanyModel>(x => x.Supplier == 1));
}
if (planthireCheckBox.IsChecked == true)
{
criteria.Add(new Predicate<CompanyModel>(x => x.Planthire == 1));
}
if (architectCheckBox.IsChecked == true)
{
criteria.Add(new Predicate<CompanyModel>(x => x.Architect == 1));
}
if (qsCheckBox.IsChecked == true)
{
criteria.Add(new Predicate<CompanyModel>(x => x.QS == 1));
}
if (projectManagerCheckBox.IsChecked == true)
{
criteria.Add(new Predicate<CompanyModel>(x => x.ProjectManager == 1));
}
if (structEngCheckBox.IsChecked == true)
{
criteria.Add(new Predicate<CompanyModel>(x => x.StructEng == 1));
}
if (servEngCheckBox.IsChecked == true)
{
criteria.Add(new Predicate<CompanyModel>(x => x.ServiceEng == 1));
}
foreach (CheckBox checkBox in companyFilters.Children)
{
if (!CheckCheckBoxes())
{
dataGrid.ItemsSource = null;
compDetailsLabel.Content = string.Empty;
}
else
{
dataGrid.ItemsSource = CompanyICollectionView;
CompanyICollectionView.Filter = dynamic_Filter;
SetSelectedCompany(selectedIndex);
dataGrid.SelectedIndex = 0;
}
}
var nfi = (NumberFormatInfo)CultureInfo.InvariantCulture.NumberFormat.Clone();
nfi.NumberGroupSeparator = ",";
numberOfCompaniesLabel.Content = "Number of Companies: " + dataGrid.Items.Count.ToString("#,#", nfi);
}
這兩種過濾方式過濾器看起來不錯自己。當我想過濾已經應用到DataGrid的過濾器時,問題就出現了。例如,用戶想要過濾公司類型,因此他們選擇currentCheckBox
,supplierCheckBox
和subbieCheckBox
。這將返回所有也是分包商的當前供應商。
這仍返回5000家公司的列表,因此用戶然後想要使用搜索功能來查找他們知道的公司的名稱。但它不搜索已過濾的CompanyICollection
,它重置它並過濾整個列表(27000家公司)。
我相信問題是我每次創建一個新的CompanyICollectionView.Fiilter
,當我想搜索一個現有的。有沒有辦法過濾已經過濾的ICollectionView
?
編輯(新增dynamic_Filter):
private bool dynamic_Filter(object item)
{
CompanyModel company = item as CompanyModel;
bool isIn = true;
if (criteria.Count() == 0)
return isIn;
isIn = criteria.TrueForAll(x => x(company));
return isIn;
}
你使用兩個濾波器相同的項目源? – ZwoRmi
'DataGrid'具有相同的'ItemsSource'是的,('CompanyICollectionView') – CBreeze
哪裏來自'dynamic_Filter'?從「標準」創建? – ZwoRmi