我有一个启用了分页的超网络网格。由于要显示的数据大约为 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] [prev]</b>")
htmlString.Append(" ")
htmlString.Append("[default]")
htmlString.Append(" ")
htmlString.Append("<b>[next] [page:[pagecount]:Last]</b>")
htmlString.Append(" ")
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
使用自定义分页时,您将为要加载的页面提供数据。 这是必要的,因为您的自定义分页可能实现为具有字母而不是页码,如 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 的数据源时,将 EnableInternalRowsManagement 设置为 true 不会产生任何影响。