2015-06-25 19 views
1

我有一個DataTable,它包含來自SQL Server查詢的10000多行。數據表被用作數據源爲一個DataGridView,像這樣(簡化代碼):限制使用DataSource時顯示在DataGridView中的行

MyBindingSource = New BindingSource(MyDataTable, Nothing) 
MyDataGridView.DataSource = MyBindingSource 

作爲這需要looong時間來加載,我想限制在DataGridView顯示的行數,不知何故。

我不能在我的查詢中使用TOP,因爲我需要DataTable中存在的所有數據以便稍後進行過濾,而無需重新設置數據源(MyBindingSource.Filter = MyFilter)。

此外,我無法使用Filter屬性來限制行數,因爲查詢結果中沒有相關數據可用於此目的。爲了解決這個問題,我想過將TSQL的ROW_NUMBER添加到查詢結果(MyBindingSource.Filter = "[RowNumberField] < 100")中,但只有在過濾器中沒有使用其他字段時才能使用。

任何想法?

+0

選中此[在Windows窗體DataGridView控件中實現虛擬模式](https://msdn.microsoft.com/zh-cn/library/15a31akc.aspx) – Fabio

+0

我在查找解決方案時遇到了該文章,但對於這樣一個看起來很簡單的任務似乎有很多模糊...... –

+0

你確定「瓶頸」是「datagridview」而不是你的SQL查詢嗎? – Fabio

回答

0

這裏有兩種選擇:

  1. 我只想實現使用您所有的意見分頁(過濾或未經過濾)這個technique使用它使用的BindingSource對象識別分頁符BindingNavigator GUI控制。

  2. 您還可以通過使用OR operator來過濾多個條件,但我不明白這是如何幫助您使用當前的方法,因爲您的行數將不得不在每個過濾器後重新計算。 [RowNumberField] <在過濾器之後,100可能會返回100行,沒有過濾器只有10行。

你可以做的是移動過濾邏輯到您的SQL查詢,然後只有始終顯示基於行數的第一個X行(我假設你在每次使用TSQL的ROW_NUMBER()動態添加)。

這種方法的優點是您可以在TSQL中執行功能更強大的過濾,並且可以讓數據源更小。

如果你確實採取這種方法,小心你的查詢與你的視圖邏輯混合 - 我會推薦Repository Pattern

+0

我會嘗試實施分頁以查看我得到的結果。目前正在處理其他事情,但我希望能在幾周內回到這個問題。 –

相關問題