2012-05-04 21 views
0

我有一個啓用了分頁的ultrawebgrid。由於要顯示的數據大約爲10K行,因此通過設置LoadOnDemand =「XML」屬性執行分頁。使用LoadOnDemand作爲XML的ultrawebgrid分頁

我面對的問題是當我瀏覽頁面時,我可以看到一個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 

回答

1

使用自定義分頁預計將爲你提供你正在尋找加載頁面的數據。這是必要的,因爲您的自定義分頁可能實現爲具有字母而不是像example in the Infragistics help這樣的頁碼。

如果您正在尋找這樣做你需要做以下修改:

  • 的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爲假,則當您單擊分頁器中的第一個,前一個,數字,下一個和最後一個選項時,網格會自動處理分頁。這也可以讓你保持你的數據,而不必手動處理排序和過濾。如果你這樣做,你仍然會刪除PageIndexChanged處理程序。

請注意,然後對於輸入後轉到按鈕,您可能需要在JavaScript中設置頁面,這可以使用WebGrid的goToPage客戶端方法完成。

雖然它與您遇到的問題無關,但使用InitializeDataSource設置WebGrid的DataSource時,將EnableInternalRowsManagement設置爲true並沒有任何影響。

+0

根據你(代碼片段u've posted),自定義分頁設置爲true,我們必須手動爲每個頁面提供數據,因爲我們導航並手動處理排序和過濾,然後我們必須在Grid的InitializeDataSource事件中設置DataSource,我們可以在頁面加載時直接實現這一點,我們甚至不需要將LoadOnDemand設置爲XML,因爲我們正在手動處理所有功能。 SampleGrid.Browser = BrowserLevel.Xml和SampleGrid.DisplayLayout.LoadOnDemand = LoadOnDemand.Xml有什麼用處。繼續... –

+0

正如你所建議的,我沒有將自定義分頁設置爲false。現在分頁沒問題,我可以對整個數據集進行排序,但只能在我所在的頁面上進行篩選。您能否建議我們如何實現整個數據集的篩選?是否有任何財產需要設置或我們是否需要手動處理。 –

+1

將LoadOnDemand和Browser設置爲Xml的價值在於,它爲您提供了AJAX按需加載功能。如果您要在頁面加載中處理此問題,則在分頁時不會進行異步刷新。對於有關過濾的問題,您設置了與過濾相關的網格屬性? – alhalama