2009-09-22 92 views
6

我有一個需要由最終用戶過濾(搜索)的大約1000個對象的ObservableCollection。用戶必須能夠按名稱或員工ID進行搜索。列表控件使用FilteredEmployees,員工在頁面加載時加載所有內容。通過用戶輸入過濾ObservableCollection

目前,我有它設置爲這樣:

public ObservableCollection<EmployeeServicesData> Employees { get; set; } 
public ObservableCollection<EmployeeServicesData> FilteredEmployees { get; set; } 

internal void FilterEmployee(string searchText, bool isByName) 
{ 
    if (searchText.Length > 0) 
    { 
     IEnumerabe<EmployeeServicesData> filter; 

     if (isByName) 
      filter = Employees.Where(x => x.Name.Length >= searchText.Length).Where(x => x.Name.Substring(0, searchText.Length) == searchText.ToUpper()); 
     else 
      filter = Employees.Where(x => x.EmployeeNumber.ToString().Length > searchText.Length).Where(x => x.EmployeeNumber.ToString().Substring(0, searchText.Length) == text); 

     foreach (EmployeeServicesData employee in filter) 
      FilteredEmployees.Add(employee); 
    } 
} 

衛生是此方法之前進行處理。

這沒有什麼特別的味道。我應該爲此使用兩種方法,還是有更好的方法來處理過濾?

我想讓員工保持不變的狀態,這樣我就可以將FilteredEmployees重新填充到完整列表中,而無需再次敲擊數據庫。

+0

什麼類型是您的列表控件?如果它可以直接消費過濾員工而不是複製他們,那將是很整潔的,但只有1000人可能根本就不重要。 – 2009-09-22 15:49:22

+0

只是FilteredEmployees上的常規舊ListBox綁定 – Slipfish 2009-09-22 15:57:55

回答

1

看起來好像你正試圖查看searchText是否包含在員工姓名或員工編號中。

你可以這樣做,而不是:

x.Name.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0 
x.EmployeeNumber.ToString().IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0 

或者你可以使用StartsWith代替的IndexOf。

編輯:List控件中存在大量數據的另一個問題是渲染需要很長時間。因此,如果您在啓動時未經過濾,Silverlight或WCF或任何必須將所有1000都渲染到控件中(即使您沒有看到所有這些控件),則可能需要一點時間。 Silverlight 3有UI Virtualization,這可能是你在這裏可以做的最好的優化。

+0

它目前正在被分頁網關填充,因此在那裏沒有問題。 – Slipfish 2009-09-22 15:57:06

2

我知道這是一箇舊的帖子,但我用它來幫助我的過濾方面,並注意到SlipFish通過循環IEnumerable集合創建ObservableCollection。

由於構造的ObservableCollection接受IEnumerable集合中的ObservableCollection可以這樣創建:

FilteredEmployees = new ObservableCollection<EmployeeServicesData>(filter); 
+0

非常有用的知道+1 – electricalbah 2014-06-30 06:58:32

1

看看這個帖子的filtered observable集合。

+0

給了這段代碼一個嘗試,正是我所期待的,謝謝指出! – 2014-10-08 11:16:41