5

好的,所以我试图让我的自定义分页在 Telerik RadGrid 上进行(类似于asp:Gridview),但我仍然碰壁。(我的问题的第一部分在这里得到了回答)

所以我已经实施了这个建议。我使用以下存储过程

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 条。

我究竟做错了什么?

4

3 回答 3

14

您需要告诉网格总共有多少条记录。这是通过设置网格的VirtualItemCount属性来完成的(您必须查询记录的总数)。

有关详细信息,请查看文档页面或参考在线演示自定义分页

于 2010-03-07T20:52:46.827 回答
1

Martin 关于 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

显然,如果您只是在执行过程中从数据库中检索记录,那么您将希望将此作为数据访问调用的一部分。

于 2010-04-27T18:13:54.760 回答
0

您也可以使用 ObjectDataSource 来实现。

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

即使用带有CustomPaging 的ObjectDataSource 的RadGrid 即分页逻辑需要您自己实现。

ObjectDataSource 也有两种方法 1. SelectMethod(您可以在其中指定返回数据的方法) 2. SelectCountMethod(您可以在其中指定返回总计数的方法)

于 2010-07-26T11:42:48.797 回答