2010-11-16 77 views
0

我正在構建一個簡單的勝利形式的應用程序與一個數據網格,一個文本框。 我有大約10K的名字記錄。文本框自動完成 - Winform + LINQ

我想要做的就是實現某種形式的自動完成功能,這樣當用戶鍵入到文本框,數據網格被更新,以顯示相應的比賽。

只是爲了測試這一點,我有一個DataContext對象,它返回名稱表,我把一些代碼在textBox1_TextChanged事件數據源與

this.dataGrid1.DataSource = (from p in connectionWrapper.getConnectionObj.PatientsNormalizeds where p.Name.Contains(textBox1.Text) select p).Take(30);

這工作在本地連接罰款復位但是當從遠程SQL服務器提取數據時,這當然太慢了,打字變得緩慢並且對於用戶來說是不可接受的。

只是不知道什麼可以在沒有改變設計來完成。我當然可以在form_loading中將整個表格加載到列表或DataTable中,並針對它執行搜索,但這會導致表單停止響應3秒左右...

這對大多數開發人員來說可能非常簡單,但我很新。

謝謝!

+0

其實,你首先選擇包含在DB用戶輸入的所有名稱,只有在這之後,你採取的第一個30個結果。但你的數據庫已經完全處理!您應該在找到30個第一個結果後立即停止您的查詢。我不太瞭解LINQ或SQL,但如果你這樣做,解決方案應該很簡單。 – 2010-11-16 13:44:01

+0

是一個字符串還是填充一個對象?有時候,如果你返回一些對象,它會顯着減慢你的加載時間,因爲它必須填充每個對象。 – Gage 2010-11-16 13:46:08

+0

這是一個對象,但沒有什麼幻想,只是名稱,dob,電話#等等等。 – Rillanon 2010-11-16 13:53:02

回答

1

有幾種方法值得思考。第一種方法不涉及每次按鍵過濾,而是搜索用戶何時暫停,即他們認爲自己的輸入已足夠,並且希望看到返回的結果。這可以通過使用定時器完成,其中每次按鍵都會重置延遲。

使用後臺線程來運行查詢離開界面的響應而檢索數據。

我也想看看返回從LINQ的最低目標,即只是p.Name而不是整個p對象。這也將有助於加快數據傳輸和響應速度。

+0

這可以很容易地通過使用反應性擴展實現。 – Giorgi 2010-11-16 13:49:21

+0

@Giorgi,看起來像一個答案。你應該這樣發佈。 – Lazarus 2010-11-16 13:52:35

+0

謝謝!這給了我一些很好的想法。 – Rillanon 2010-11-16 13:53:28

0

你應該又名BackgroundWorker

0

可以在XML文件或一些數據緩存在本地運行一個後臺線程的選擇。應用程序可能第一次沒有響應(除非您使用線程在後臺預加載數據),但是對於運行應用程序的每一次,它都會非常快。
您可以實施預加載/閃屏以通知用戶數據在後臺加載。

1

可以使用無功擴展輕鬆實現它詢問,如果用戶鍵入一定量的符號遠程服務器的解決方案,暫停了一段時間,很容易。在實驗室下面的手正是這樣做的:Rx .NET HOL

+0

+1作爲一個偉大的建議! – Lazarus 2010-11-16 15:21:35

+0

我通過將設計更改爲暫停和使用背景工作時獲取簡單方法,現在延遲對用戶而言並不明顯。 – Rillanon 2010-11-17 12:26:24

+0

使用Rx會有更好的表現嗎?或者這更多的是一種以設計爲導向的改進。 – Rillanon 2010-11-17 12:26:53