2010-05-05 97 views
2

我正在寫一個過濾器來挑選物品。我有一個對象列表。這些對象包含一個數字,名稱和一些其他不相關的項目。目前,該清單包含200個項目。當輸入textbox時,我正在查看字符串是否與列表中對象的數字/名稱的一部分相匹配。如果是這樣,請將它們添加到listbox。下面是我的文本框TextChanged事件代碼:有沒有一種方法可以提高我簡單的textfilter的性能?

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條記錄,並我退格,整個列表再次出現)。 我的列表是usercontrols的列表,因爲我發現從列表中加載usercontrols所花費的時間較少,然後每次都必須初始化一個新的usercontrol。

我可以對代碼做些什麼嗎?或者只是添加usercontrollistbox導致的小延遲(小延遲= < 1秒)?

在此先感謝。

編輯 我編輯過的帖子,它是wpf。將項目放入列表並設置項目源並不能解決問題。

回答

2

我建議你兩種技術在演唱會中使用:

  1. 清理和添加項目到ListBox調用BeginUpdate()方法之前,並調用它的EndUpdate()添加完項目。這些方法專門用於避免大量插入物品時的性能損失。
  2. 引入一個計時器,並且僅在TextBox的最後一個KeyUp事件之後經過了特定時間量後才啓動過濾任務。通過這種方式,您可以增加不評估對用戶來說不重要的過濾器的機會。
+0

選項2是一個沒有去(雖然好建議雖然),但它需要立即顯示。我會嘗試第一個。 – Terry 2010-05-05 08:01:14

+0

不客氣。其實他們是獨立適用的。對於「特定的時間量」,我的意思是指1秒鐘或更短的時間(一個人在兩次連續擊鍵之間的時間多一點)。 – 2010-05-05 08:17:51

+0

確實如此,並且由於BeginUpdate和EndUpdate在我的wpf應用程序中不起作用,我認爲這將是唯一的解決方案,但我必須說服我的客戶。 :) – Terry 2010-05-05 08:19:54

0

使用BeingUpdate/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(); 
} 
+0

好吧,我以爲我有它。我的應用程序是wpf,這種方法是winforms,所以我開始尋找一個等價物,但似乎沒有任何相同的東西。儘管如此,仍然遇到同樣的問題。 – Terry 2010-05-05 08:17:22

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)); 
    }); 
} 

嘗試上面的代碼

+0

ObjType從哪裏來?數據源不能應用於我的列表框。 – Terry 2010-05-05 09:33:53

+0

這是一個方法參數,但它顯示爲使用委託的匿名方法..您可以從委託關鍵字tell}獲取並將其作爲單獨的方法,並在FindAll中調用它我希望這可以幫助您 – 2010-05-08 07:19:22

0

你只有200個項目???在WPF中,你不應該遇到任何性能滯後。只需將您的數據填充到ObservableCollection中,然後將其綁定到列表視圖。現在在您的textchanged事件中,您可以將相同的過濾器邏輯應用於ObservableCollection而不是Listview。列表視圖應該立即反映變化。

我正在處理數百萬條記錄,沒有任何延遲。

你永遠不希望創建延遲

而且看一看VirtualMode property的高級操作。

更新

而且似乎你在每一個TextChanged事件做此操作data = telList.User.H323 + telList.user.E164;。您可以事先創建一個List<data>,並只在循環內部實現您的過濾器邏輯。

+0

我試過使用此選項,但會發生另一個問題。當我輸入「ere」時,我需要顯示包含「ere」的所有項目。但是當我退格或刪除時,我需要再次填充集合。所以如果直接從ObservableCollection中刪除,我會丟失我可能需要再次添加的項目。 或者我需要2個集合,其中一個包含所有項目,另一個綁定,然後我必須添加一個控件方法來檢查綁定的集合是否已包含元素...請參閱我的問題? – Terry 2010-05-05 11:38:58

+0

是的,您需要使用2個收藏集並且您正在使用它。一個是_allUsers,另一個是你的listviewcollection。我告訴你的是將你的listviewcollection替換爲observablecollection,你的maincollection是一樣的。從長遠來看,您還可以擁有ObservableCollections列表,這些列表將在按下退格鍵時充當歷史記錄。 – Amsakanna 2010-05-06 04:23:12

1

我剛纔知道是什麼原因導致加載項目到我的列表框的延遲。我使用預定義的主題(Wpf主題),並且因爲我的列表框全部被拉伸,所以重畫需要更長的時間。所以這與編程邏輯無關,只是風格延遲了我的過濾器。

+0

好。你仍然可以選擇裝訂。 – Amsakanna 2010-05-06 04:24:23

0

您必須先使用lambda從列表中獲取所有相關項目,然後嘗試使用AddRange將項目添加到列表框中。

+0

請注意一些代碼? – Blazemonger 2012-11-08 17:05:07

相關問題