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 (где вы можете указать метод, который возвращает общее количество)