0

我有一个启用了分页的 ultrawebgrid。由于要显示的数据大约为 10K 行,因此通过设置 LoadOnDemand="XML" 属性进行分页。

我面临的问题是当我浏览页面时,我可以看到发生了 AJAX 调用,但显示的数据只是第一页的数据。

例如:我有 10 页数据,当我单击“3”页时,网格会显示“1”页本身的内容。

但是,如果我对任何列进行排序或过滤,排序和过滤结果都符合预期。

.aspx:

<DisplayLayout BorderCollapseDefault="Separate" Name="SampleGrid" RowHeightDefault="20px" SelectTypeRowDefault="Single" Version="4.00" AllowColSizingDefault="Free" SelectTypeColDefault="Single" TableLayout="Fixed" AllowAddNewDefault="Yes" AllowSortingDefault="OnClient" AllowUpdateDefault="Yes" AutoGenerateColumns="False" CellClickActionDefault="Edit" ViewType="Hierarchical">.

<Pager><PagerStyle CssClass="igwgPgrBlack2k7" /></Pager>

</DisplayLayout>

.vb:

Protected Sub SampleGrid_InitializeDataSource(ByVal sender As Object, ByVal e As Infragistics.WebUI.UltraWebGrid.UltraGridEventArgs) Handles SampleGrid.InitializeDataSource

Dim dsData As System.Data.DataSet

Dim sql As String

dsData = DataManager.ExecuteDataset(ConnectionType.XXX, Data.CommandType.Text, sql) // getting dataset


'Me.SampleGrid.DisplayLayout.Pager.PageCount = Math.Ceiling(dsData.Tables(0).Rows.Count/Me.SampleGrid.DisplayLayout.Pager.PageSize) //on first load, i'm getting the PageSize as 8 whereas it has to be 50 rows, I tried setting the page size in 'InitializeLayout' but 'InitializeDataSource' event is called first. So where do i set the grid's PageSize.


SampleGrid.DataSource = dsData
End Sub


Protected Sub SampleGrid_InitializeLayout(ByVal sender As Object, ByVal e As Infragistics.WebUI.UltraWebGrid.LayoutEventArgs) Handles SampleGrid.InitializeLayout

Dim htmlString As New StringBuilder

SampleGrid.Browser  = BrowserLevel.Xml

e.Layout.LoadOnDemand   = LoadOnDemand.Xml

e.Layout.RowsRange = 50

e.Layout.XmlLoadOnDemandType = XmlLoadOnDemandType.Accumulative

SampleGrid.DisplayLayout.Pager.StyleMode=PagerStyleMode.QuickPages

SampleGrid.DisplayLayout.EnableInternalRowsManagement=True 

SampleGrid.DisplayLayout.Pager.AllowCustomPaging=True 

SampleGrid.DisplayLayout.Pager.AllowPaging = True

SampleGrid.DisplayLayout.Pager.PageSize = 50

SampleGrid.DisplayLayout.Pager.QuickPages = 5

htmlString.Append("<table cellspacing='0' cellpadding='0' style='width:100%;border:solid 1px Black;'>")

htmlString.Append("<tr>")

htmlString.Append("<td width='25%' align='right'>Viewing page [currentpageindex] of [pagecount] </td>")

htmlString.Append("<td align='center'>")

htmlString.Append("<b>[page:1:First]&nbsp;[prev]</b>")

htmlString.Append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")

htmlString.Append("[default]")

htmlString.Append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")

htmlString.Append("<b>[next]&nbsp;[page:[pagecount]:Last]</b>")

htmlString.Append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")

htmlString.Append("</td>")

htmlString.Append("<td width='25%' align='left' title='Enter page number and press Enter'>")

htmlString.Append("Go to:<input id='PagerGotoPageNumber' size='5' style='vertical-align:text-bottom;height:20px;font-family:verdana;font-size:8pt;padding:0 0 0 0;border:solid 1px black' onkeydown='return gotoPageKeyDown();' type='text' autocomplete='off' />")

htmlString.Append("<button style='height:22px' onclick='gotoPage();'>Go</button>")

htmlString.Append("</td>")

htmlString.Append("</tr>")

htmlString.Append("</table>")

SampleGrid.DisplayLayout.Pager.Pattern=htmlString.ToString()

End Sub


Private Sub SampleGrid_PageIndexChanged(ByVal sender As System.Object, ByVal e As Infragistics.WebUI.UltraWebGrid.PageEventArgs) Handles SampleGrid.PageIndexChanged

        SampleGrid.DisplayLayout.Pager.CurrentPageIndex = e.NewPageIndex

    End Sub
4

1 回答 1

1

使用自定义分页,您应该为要加载的页面提供数据。这是必要的,因为您的自定义分页可以实现为具有字母而不是页码,如 Infragistics 帮助中的示例

如果您希望这样做,则需要进行以下更改:

  • PageIndexChanged 事件应该被删除。
  • 您绑定到的数据集应该只包含特定页面的元素。请注意,这也会对排序和过滤产生影响,并且可能会阻止它们工作,除非您返回过滤和/或排序的结果。

显示使用您正在使用的代码进行分页的简单示例是:

Protected Sub UltraWebGrid1_InitializeDataSource(sender As Object, e As Infragistics.WebUI.UltraWebGrid.DataSourceEventArgs) Handles UltraWebGrid1.InitializeDataSource        
    Me.UltraWebGrid1.DisplayLayout.Pager.PageCount = 4

    Me.UltraWebGrid1.DataSource = Me.GetEmployees(Me.UltraWebGrid1.DisplayLayout.Pager.CurrentPageIndex)
End Sub

    Private Function GetEmployees(page As Integer) As DataTable
    Dim dtData As DataTable = New DataTable("Employees")

    dtData.Columns.Add("EmployeeID", GetType(Integer))
    dtData.Columns.Add("Name", GetType(String))
    dtData.Columns.Add("OnSite", GetType(Boolean))
    dtData.Columns.Add("DateOfHire", GetType(DateTime))
    dtData.Columns.Add("Department", GetType(Integer))

    For i As Integer = (page - 1) * 50 To (page - 1) * 50 + 50 Step 1
        dtData.Rows.Add(New Object() {i, String.Format("Name {0}", i), (i Mod 2 = 0), DateTime.Today, i Mod 8})
    Next

    Return dtData
End Function

'Protected Sub UltraWebGrid1_PageIndexChanged(sender As Object, e As Infragistics.WebUI.UltraWebGrid.PageEventArgs) Handles UltraWebGrid1.PageIndexChanged
'    Me.UltraWebGrid1.DisplayLayout.Pager.CurrentPageIndex = e.NewPageIndex
'End Sub

请注意,您可能不需要使用自定义分页,如果将 DisplayLayout.AllowCustomPaging 设置为 false,那么当您单击分页器中的第一个、上一个、数字、下一个和最后一个选项时,网格将自动处理分页。这也将允许您保持数据不变,而不必手动处理排序和过滤。如果你这样做,你仍然会删除 PageIndexChanged 处理程序。

请注意,对于输入后的转到按钮,您可能需要在 JavaScript 中设置页面,这可以使用WebGrid的 goToPage 客户端方法完成。

虽然它与您遇到的问题无关,但在使用 InitializeDataSource 设置 WebGrid 的 DataSource 时,将EnableInternalRowsManagement设置为 true 没有影响。

于 2012-05-04T12:44:55.440 回答