2010-03-07 22 views
5

OK, więc staram się, aby moje niestandardowe stronicowanie działało na Telerik RadGrid (podobne do asp:Gridview), ale wciąż uderzam w ścianę. (pierwsza część mojego pytania została udzielona here)GridView (RadGrid) i Custom Paging

Więc wdrożyłem tę sugestię. Używam następujących przechowywanych proc

ALTER PROCEDURE [dbo].[bt_HealthMonitor_GetAll] 
(
    @StartRowIndex  int, 
    @MaximumRows  int 
) 

AS 
SET NOCOUNT ON 

Select 
RowNum, 
[ID], 
[errEx], 
[errURL], 
[errSource], 
[errUser], 
[errMessage], 
[errIP], 
[errBrowser], 
[errOS], 
[errStack], 
[errDate], 
[errNotes] 
From 
(
Select 
    [ID], 
    [errEx], 
    [errURL], 
    [errSource], 
    [errUser], 
    [errMessage], 
    [errIP], 
    [errBrowser], 
    [errOS], 
    [errStack], 
    [errDate], 
    [errNotes], 
    Row_Number() Over(Order By [ID]) As RowNum 
    From dbo.[bt_HealthMonitor] t 
) 
As DerivedTableName 
Where RowNum Between @StartRowIndex And (@StartRowIndex + @MaximumRows) 

Order By [ID] Desc 

potem drugi procedurę przechowywaną, aby uzyskać zliczania rekord

ALTER PROCEDURE [dbo].[bt_HealthMonitor_GetRecordCount] 

AS 
SET NOCOUNT ON 

return (Select Count(ID) As TotalRecords From bt_HealthMonitor) 

i używam LINQ do SQL do wiązania się z moim RadGrid

Protected Sub RadGrid1_NeedDataSource(ByVal source As Object, ByVal e As Telerik.Web.UI.GridNeedDataSourceEventArgs) 

    Dim startRowIndex As Integer = (RadGrid1.CurrentPageIndex * RadGrid1.PageSize) 
    Dim maximumRows As Integer = RadGrid1.PageSize 

    Dim HealthMonitorDC As New DAL.HealthMonitorDataContext 

    Dim r = HealthMonitorDC.bt_HealthMonitor_GetAll(startRowIndex, maximumRows) 
    RadGrid1.DataSource = r 
End Sub 

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit 
    Dim HealthMonitorDC As New DAL.HealthMonitorDataContext 
    Dim count = HealthMonitorDC.bt_HealthMonitor_GetRecordCount() 
    RadGrid1.MasterTableView.VirtualItemCount = count.ReturnValue 
    RadGrid1.VirtualItemCount = count.ReturnValue 
End Sub 

Ale problem, którego doświadczam cing jest to, że siatka chwyta tylko pierwsze 10 wierszy (zgodnie z oczekiwaniami), ale muszę ją pobrać, aby rozpoznać, że w tabeli znajduje się 200 wierszy, aby pojawiły się ikony stronicowania.

Jeśli używam dropdownlist, aby wyświetlić 50 rekordów, a następnie 50 pojawi się, ale nadal nie ma ikony przywoławcze, żeby mnie do następnego 50.

Co robię źle?

+0

Dzięki ponownie za @Martin pomoc. Opublikowałem swoje wyniki na moim blogu dla innych osób, mam nadzieję, że znajdę i wykorzystam http://dotnetblogger.com/post/2010/03/07/RadGrid-with-Custom-Paging-Sorting-Filtering.aspx –

Odpowiedz

14

Musisz podać siatkę, ile jest w sumie rekordów. Odbywa się to poprzez ustawienie właściwości siatki VirtualItemCount (konieczne będzie zapytanie o całkowitą liczbę rekordów). Szczegółowe informacje można znaleźć na stronie documentation page.

+0

Mam edytowane moje pytanie powyżej. Zrobiłem to, co "wygląda" na sugestie w wersji demonstracyjnej, ale nadal otrzymuję tylko najlepsze rekordy "X", gdzie "X" to "RadGrid1.PageSize" –

+0

PS: dzięki za wskazanie mnie we właściwym kierunku jak dotąd. –

+1

Nieważne ... Rozwiązałem to. Zapomniałem wstawić 'AllowCustomPageing =" true "' –

1

Martin jest poprawny w odniesieniu do VirtualItemCount. Najłatwiejszym miejscem do wdrożenia tego jest zdarzenie NeedDataSource.

Pamiętaj, że musisz wprowadzić trochę logiki, aby uwzględnić mniejszą liczbę wpisów na ostatniej stronie. Oznacza to, że jeśli masz 14 rekordów po 5 na stronę, chcesz się upewnić, że twoja logika próbuje tylko pobrać 4 rekordy z ostatniego połączenia.

Oto jak to zrobiłem (na podstawie listy rodzajowe):

If gridRecords.Count < (grid.pagesize * (grid.pageIndex + 1)) Then 
     gridRecords.GetRange(grid.pageIndex * grid.pagesize, gridRecords.Count - (grid.pagesize * grid.pageIndex)) 
    Else 
     gridRecords.GetRange(grid.pageIndex * grid.pagesize, grid.pagesize) 
    End If 

Oczywiście, będziemy chcieli zrobić to jako część rozmowy dostępu do danych jeśli pobieranie tylko rekordy z bazy danych jak idziesz.

0

Można zaimplementować również przy użyciu ObjectDataSource.

http://www.unboxedsolutions.com/sean/archive/2005/12/28/818.aspx

tj użyciu RadGrid z ObjectDataSource z logiką CustomPaging tj stronicowania musi wdrażane na własną rękę.

także ObjectDataSource ma dwie metody 1. SelectMethod (Gdzie można określić metodę, która zwraca dane) 2. SelectCountMethod (gdzie można określić metodę, która zwraca całkowitą liczbę)