2011-07-05 12 views
0

我有簡單的ListView,它有3-4列顯示客戶端列表。它下面有一個TextBox,用於在Sql Server中搜索並顯示相關結果(基本上每輸入一個字母時它都會執行sql query。它在沒有多少客戶端的情況下工作正常,但超過1000個字母可以顯示一個字母,秒,顯示大量的記錄,那麼另一封信使它有點快,接着又...當WinForms中的字符數大於3時,在ListView中顯示搜索結果

所以我想到了幾個可能的修復的這樣:

  • 開始搜索中輸入3個字母后(名稱至少有3個字符),對第1個/第2個字母不做任何處理,並將所有內容顯示爲0(從搜索中返回時仍存在延遲)
  • 加載列表一次到List<string>或創建某種對象來覆蓋此,但我需要保持與其他用戶完成的任何更改(添加新客戶端,更新名稱等)從其他工作場所同步,並始終用適當的信息更新列表。保持數據庫相關似乎是一個更簡單的想法。
  • 其他想法?也許兩者兼而有之?

這裏的代碼示例:

private void klienciSearchBoxTextChanged(object sender, EventArgs e) { 
     string varSzukaj = klienciSearchBox.Text.Trim(); 
     if (varSzukaj.Length >= 3) { 
      pobierzDaneSqlKlientaOgolne(listViewKlienci, lvwColumnSorterKlienci, varSzukaj, radioButtonWyszukajPoPortfelu.Checked ? 1 : 0); 
     } else if (varSzukaj.Length > 0 && varSzukaj.Length < 3) { 
      // do nothing 
     } else { 
      pobierzDaneSqlKlientaOgolne(listViewKlienci, lvwColumnSorterKlienci, varSzukaj, radioButtonWyszukajPoPortfelu.Checked ? 1 : 0); 
    } 

是第一或第二個想法不夠好或有人能提出其他實施?

+2

-1投票值得評論 – MadBoy

+0

我upvoted回零,這是有效的用戶界面場景。不確定誰downvoted。 –

回答

1

在類似的情況下,我們通過限制用戶可以找回的結果數來處理這個問題。我們使用了500的限制來保持快捷,並在運行選擇查詢之前運行計數查詢,以檢查是否要暫停軟件。

這也取決於問題是無響應的GUI或等待用戶。由於可以通過在單獨的線程上運行查詢來修復無響應的GUI,因此可以檢查查詢是否正在運行,並在用戶鍵入下一個字母時取消它。另一個防止用戶等待的方法是顯示部分結果。

+0

這是一個等待結果的問題。運行後臺線程是一個選項,但問題並不大,因爲使用3個字符返回的結果類似於5或10,因此限制3個字符以上的搜索似乎是一個好方法。唯一「較慢」的問題是當用戶使用退格鍵並且列表中必須填入1200個名稱,因此需要1-4秒,但我想只有一次(從搜索中返回)不是大不了。 – MadBoy

1

您目前用於搜索的界面設計類型更適合不經常更新的數據。例如,假設您有一個每週更新一次的10000個產品的列表,在這種情況下,請在本地緩存數據,然後從緩存中取出數據,而不是數據庫中的每個字母。這樣,它是對數據庫的查詢,然後是對本地緩存的許多查詢。

在您的情況下,數據更新更爲常見,因此我會更改界面以允許用戶輸入一些字母,然後在準備好檢索結果時按下搜索按鈕。正如JamesB所指出的那樣,限制結果回來也會有所幫助,但是你仍然會對數據庫進行大量查詢。如果用戶可以忍受一些數據延遲,緩存可以是一種選擇。有很多不必要的搜索去數據庫的「M」,然後「馬」,然後「瘋狂」,然後「瘋狂」等等...

+0

搜索按鈕也是一個選項。我會詢問用戶是否喜歡第一個選項或按鈕。按鈕肯定會限制搜索 – MadBoy