2011-11-23 53 views
1

我不明白怎麼就只能從數據庫中獲取所需的行數,當你需要知道的行總量序獲得分頁工作。如何使用PagedDataSource和SQL進行分頁?

我的意思是:我 跟着這個例子: http://www.c-sharpcorner.com/uploadfile/rizwan328/datalist-custom-paging-in-Asp-Net-using-C-Sharp/

但是,而不是使用一個DataTable我有一個數據庫。

我得到這樣的數據庫的消息,這得到所有的消息從我的新聞表:

List<News> news = News.GetNews(); 

public static List<News> GetNews(){ 
    List<News> news = new List<News>(); 
    using (SqlConnection conn = new SqlConnection(CONNSTRING)) { 
      SqlCommand cmd = new SqlCommand("SELECT * FROM News_news ORDER BY date DESC", conn); 

,從所有的新聞項目獲取的所有數據。

然後,我創建一個PagedDataSource:

PagedDataSource objPds = new PagedDataSource(); 
objPds.DataSource = news; 
objPds.AllowPaging = true; 
objPds.PageSize = numRows; 
//Set the current page 
objPds.CurrentPageIndex = CurrentPage; 

//Set the buttons 

推杆的中繼器中的數據,將顯示aspx頁面

repeater1.DataSource = objPds; 
repeater1.DataBind(); 

的前5項喜歡我有一個分頁的頭版說向我顯示總頁數和當前頁面,當我點擊下一頁的按鈕時,我會再次完成。

但我知道這是不正確的,因爲我總是得到所有的新聞,然後discared的消息,我不需要。但是,請問,如何做到這一點,以便我只獲得所需的新聞項目?

我需要先算在我的表中的行數?

+0

您可能缺少pageCount屬性初始化 –

+0

我不明白,我需要能夠設置總頁數,不是嗎?根據數據源,它會創建一個總頁數,所以不是這樣,所以您必須獲取所有數據? –

回答

2

要使用PagedDataSource,所有記錄都將在查詢期間被退回,但您可以使用持久性數據存儲(Session和ViewState中)來存儲數據集使每個頁面請求沒有再次命中數據庫。

如果你想永遠只拉回記錄您正在查看的頁面,因爲據我所知,你將不得不推出自己的尋呼解決方案。我回到了自己尋呼解決方案的需求,這是一個我問的問題,它幫助我做我需要的,Paging choice, on database or in the web application

0

你並不特別需要知道結果的數量有PagedDataSource工作。它會爲你提供數據源。

在你的樣品上,你是不是專門設置PageSize,所以你需要添加

objPds.PageSize = 5; 

鑑於你的榜樣,雖然,你可能會考慮只是改變或增加GetNews到TOP添加到查詢,因爲它不會出現你真的需要分頁。你需要的僅僅是前5個結果(或者至少,這就是我正在閱讀的結果)。

public static List<News> GetNews(int Top){ 
    //OTher stuff here. 
    SqlCommand cmd = new SqlCommand(String.Format("SELECT TOP {0} * FROM News_news ORDER BY date DESC", Top), conn); 
} 

然後調用以下內容,您可以完全擺脫PagedDataSource。

List<News> news = News.GetNews(5); 
+0

objPds.PageSize = numRows; numRows在開頭定義爲5;) 問題是我知道如何獲得前5個元素,甚至是如何使用row_numbers,但沒有如何正確地使用PagedDataSource實現它,因爲它需要元素的總量。所以我很想知道如何正確地實現pagedDataSource,這樣我就不必一直去數據庫。 objPds.DataSource不接受int或其他東西,是嗎? –

+0

@reaper_unique我不敢相信我完全掩飾了這一點。我道歉。 DataSource不會接受int,no。它接受任何實現IEnumerable的東西。您必須在每次加載時重新加載DataSource,並且它必須是每個頁面加載的相同DataSource才能使分頁正常工作。如果您不想在每次加載時擊中數據庫,則可以將數據保存在應用程序緩存中。 –

2

你可以通過設置VirtualItemCount項的總數和AllowCustomPaging到真正使用自定義分頁。這樣你就可以從數據源中檢索你的PagedDataSource在特定回發期間需要的那些記錄集。