GridView (RadGrid) and Custom Paging

2019-02-23 01:32发布

问题:

Ok, so I'm trying to get my custom paging going on the Telerik RadGrid (similar to the asp:Gridview), but I'm still hitting a wall. (the first part of my question was answered here)

So I have implemented the suggestion. I use the following 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

Then another stored procedure to get the record count

ALTER PROCEDURE [dbo].[bt_HealthMonitor_GetRecordCount]

AS
SET NOCOUNT ON

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

And I'm using LINQ to SQL to bind to my 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

But the problem I'm experiencing is that the grid only grabs the first 10 rows (as expected) but I need to get it so that it will recognize that there are 200 rows in the table so that the paging icons show up.

If I use the dropdownlist to display 50 records, then 50 show up, but still no paging icons to get me to the next 50.

What am I doing wrong?

回答1:

You need to tell the grid how many records there are in total. This is done by setting the grid's VirtualItemCount property (you will have to query the total number of records).

For details, have a look at the documentation page or refer to the online demo for custom paging.



回答2:

Martin is correct regarding VirtualItemCount. The easiest place to implement this is in the NeedDataSource event.

Remember that you'll need to put some logic in there to account for fewer records on the last page. That means that if you have 14 records with 5 per page, you want to make sure your logic only tries to retrieve 4 records on the last call.

Here's how I did it (using a generic list):

    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

Obviously, you'll want to do this as part of your data access call if you're only retrieving the records from the database as you go.



回答3:

You can implement also using the ObjectDataSource.

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

i.e using RadGrid with ObjectDataSource with CustomPaging i.e Paging logic needs to implemented on your own.

Also ObjectDataSource has two methods 1. SelectMethod (Where you can specify the method which returns the data) 2. SelectCountMethod (Where you can specify the method which returns the total Count)