2009-11-19 38 views
2

在我的表單中,有一個datagridview可能會達到約70k個項目,具體取決於掃描客戶獲得的快樂程度。我也有一個文本框,允許用戶使用textchanged事件搜索datagridview。我使用類似子句的select語句並填充數據集。我不認爲這會削減它,因爲當有大量記錄時,程序會掛起並且會變得遲緩。如果性能是重中之重,我能做到這一點的最佳方式是什麼?在VB.NET中通過DataGridView搜索的最佳方法?

+0

不要猶豫,給予好評/接受的答案,可以幫助您;-) –

回答

1

如果您不擔心所選記錄的數量,只需下載整個數據集即可。

在您填充的表上創建一個dataview對象。

設置DataGridView.DataSource =您的dataview對象。

然後,不要使用文本框的textchanged事件來填充數據集,而是使用它來更改數據視圖中的.RowFilter屬性。

+0

你能詳細解釋一下嗎? – broke

+0

你最初的選擇沒有'where子句'。填寫整個DataTable。 然後聲明數據視圖: 昏暗DV作爲新的數據視圖(dataTable的) GridView.DataSource = DV 然後,設置基於文本框的TextChanged事件的dv.RowFilter: dv.RowFilter =「字段名像'*「&TextBox.Text&」*'「 –

+0

好吧生病了試試吧。謝謝 – broke

2

提高性能的顯而易見的方法是過濾一個按鈕,而不是經常調用的textchanged事件。

如果您不想改變它的工作方式,另一個選擇是直到輸入了多個字符纔開始搜索,然後等待至少x秒鐘後再發射另一個搜索。

+0

我想這可能是最好的選擇。 – broke

+0

我在過去的TextChanged事件中遇到了同樣的問題。我只是決定用一個按鈕來代替。 –

1

我發現的最好方法是在另一個線程上實際運行SQL查詢,將數據集存儲在內存中,並讓計時器每毫秒添加10條記錄。這樣用戶界面仍然填滿,但主處理器並不忙於繪製整個時間,用戶仍然可以鍵入。這可以根據運行的計算機進行放大和縮小。我已經使用Listbox和組合框完成了這一工作,並且它非常簡單(如果您使用委託來計數並調用簡單)。

這應該給你你想要的表現......也就是說,如果你有足夠的時間來實現它。

~~~~~~~~~~~~~~~~~~~~編輯~~~~~~~~~~~~~~~~~~~~

如果你希望,我可能會發布這個列表框版本的示例代碼,因爲我實際上沒有看到網絡上的任何其他人這樣做。

+0

有沒有在數據網格視圖中實現過這個功能的地方?我有興趣爲以前的項目實現這個功能,該項目可以返回多達20k條需要運行的記錄。代碼鏈接就足夠了。謝謝! – Stevoni

+0

對不起,我沒有這個代碼的datagridview。我只有列表框和組合框。我可以將這些內容發送給您,您可以更改它繼承的控件類型,並重寫我的緩衝區/ addrow /並清除代碼,以便爲datagridview實現它。 – Jrud

+0

那真是太好了,你能從我的個人資料中收到我的電子郵件並向我發送代碼嗎? – Stevoni

1

爲什麼要返回所有記錄?實現服務器端分頁,因此一次只返回10/20/50/100(讓用戶決定)記錄。

+0

我想因爲DataGridViews本身填充比其他控件更快,我不擔心被選中的記錄數量。我希望一旦所有的數據被選中並放入數據集,我就可以搜索數據集,如果這是可能的話。 – broke

+0

在數據表中有一個.SELECT命令,我相信......也許這就是你所追求的目標? – Jrud

+0

但是這並不能解決你的滯後問題......它不是通過網絡拉動通常耗時的數據,而是通過繪製記錄並預先緩衝通常是瓶頸的行爲。 – Jrud

1

詳細闡述Meta-Knights的答案:我遇到了類似於您的問題,並決定使用計時器,該計時器在用戶鍵入密鑰時啓動。我將它設置了2秒,因爲我的用戶通常在輸入信息時正在閱讀信息。它似乎工作得很好,用戶對自動搜索功能非常滿意。

本質上的僞代碼如下:

Sub TextChanged() 
    MyTimer.Enabled= TextBox.TextLength > 0 
End Sub 

Sub TimerTick() 
    MyTimer.Enabled=False 
    Lookup(TextBox.Text) 
    MyTimer.Enabled=True 
End Sub 
相關問題