GridView (RadGrid) и пользовательский пейджинг

Итак, я пытаюсь заставить мой пользовательский пейджинг работать на Telerik RadGrid (аналогично asp:Gridview), но я все еще бью стену. ( здесь ответили на первую часть моего вопроса)

Поэтому я реализовал предложение. Я использую следующий Stored 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

Затем еще одна хранимая процедура, чтобы получить количество записей

ALTER PROCEDURE [dbo].[bt_HealthMonitor_GetRecordCount]

AS
SET NOCOUNT ON

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

И я использую LINQ to SQL для привязки к моей 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

Но проблема, с которой я сталкиваюсь, заключается в том, что сетка захватывает только первые 10 строк (как и ожидалось), но мне нужно получить ее, чтобы она распознала, что в таблице 200 строк, и отображаются значки подкачки.

Если я использую выпадающий список для отображения 50 записей, то появятся 50, но по-прежнему нет значков подкачки, чтобы перейти к следующим 50.

Что я делаю неправильно?

3 ответа

Решение

Вы должны указать сетке, сколько всего записей. Это делается путем установки сетки VirtualItemCount свойство (вам нужно будет запросить общее количество записей).

Для получения подробной информации, посмотрите на страницу документации или обратитесь к онлайн-демонстрации для пользовательской подкачки.

Мартин прав в отношении VirtualItemCount. Самое простое для реализации этого - событие NeedDataSource.

Помните, что вам нужно будет добавить немного логики, чтобы учесть меньше записей на последней странице. Это означает, что если у вас есть 14 записей по 5 на страницу, вы хотите убедиться, что ваша логика пытается извлечь только 4 записи за последний вызов.

Вот как я это сделал (используя общий список):

    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

Очевидно, вы захотите сделать это как часть вызова доступа к данным, если вы только извлекаете записи из базы данных по ходу работы.

Вы можете реализовать также с помощью ObjectDataSource.

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

т.е. используя RadGrid с ObjectDataSource с CustomPaging, т. е. логика пейджинга должна быть реализована самостоятельно.

Также ObjectDataSource имеет два метода: 1. SelectMethod (где вы можете указать метод, который возвращает данные) 2. SelectCountMethod (где вы можете указать метод, который возвращает общее количество)

Другие вопросы по тегам