2012-04-30 51 views
0

我使用代碼填充GridView,將數據源設置爲查詢返回的數據集。所以顯然,排序和分頁不會像神奇般的工作,如果我使用datasourceid =一些sqldatasource。gridview排序:每次都需要重新讀取?

我發現了很多關於如何在Web上執行此操作的示例,但它們都似乎每次都重新執行查詢。不應該將查詢的內容保存在視圖狀態中嗎?是否有某種方法可以獲取以前的查詢結果並重新排序而不必返回數據庫? (它是否將所有數據保存在視圖狀態中?如果是這樣,爲什麼我無法得到它?將所有數據全部發送回用戶的瀏覽器並將其全部發回,浪費所有帶寬,如果沒有)

此外,如果我嘗試允許分頁,看來我再次必須重新執行查詢,每次用戶轉到另一頁時。如果用戶對頁面進行排序然後頁面,那麼我必須記住隱藏字段或類似內容的排序順序,以便我可以重新讀取數據,重新排序,然後進入正確的頁面。

鑑於當您使用數據源控件時,所有這些行爲都是內置的,我想我在這裏丟失了一些東西。但是考慮到所有這些例子都是這樣緩慢而艱難的,如果我錯過了一些東西,很多其他程序員也會錯過它。

回答

1

如果您每次通過數據集對列或頁進行排序時都使用ASP.NET GridView控件,那麼您正在進行服務器回發。用這個特定的控件進行排序和分頁從來沒有'神奇'的工作,並一直是我的一個怪物。

您可以通過將要構建網格的數據源存儲在內存中,或者作爲會話或通過ViewState來加快速度。兩者都有優點和缺點,我建議你閱讀。

如果可能,我建議忘記ASP.NET GridView並查看客戶端解決方案,如jQuery jqGrid。它使用AJAX調用進行排序和分頁,而且速度要快得多,而且不那麼令人頭疼。唯一的缺點是學習曲線,但相信我從長遠看是值得的。

+0

「sorked magically」我的意思是如果你使用數據源控件,你不必編寫任何代碼來實現分頁或排序。 – Jay

+0

是的,我知道如何使用會話數據,但我真的不喜歡這樣的想法:沒有可靠的方法來丟棄數據,當它沒有時間需要,所以它最終會永遠浮動,如果用戶可以同時打開兩個屏幕實例,則會遇到問題。保存在視圖狀態是可能的,但帶寬增加一倍。通過網絡讀取數據的時間將超過在許多情況下重新查詢數據庫的時間。所以確定它是可行的,但它並不漂亮。 – Jay

+0

好吧,我明白你在說什麼......個人而言,我討厭使用數據源控件,因爲它抽象瞭如何在引擎蓋下發生的事情,但它確實節省了大量時間。ViewState並不理想,如果您可以投入一些時間使數據丟棄更可靠,則會話可能是您的選擇。 – markp3rry

0

是的,gridview每次都重新執行查詢。

如果查詢時間過長,則可以手動將數據存儲在會話或ViewState中。在填充網格的算法中,只需直接讀取它,而不是運行查詢。

你可以在頁面加載事件,運行查詢一次在沒有回傳(你可以檢查回發與

if (!Page.IsPostBack){ 
    //Run the query and save it to the session 
} 

和用於填充電網的方法,應該從讀沒有必要再次運行查詢

相關問題