ASP DataPager 返回不正确的 StartRowIndex
ASP DataPager returning incorrect StartRowIndex
我有一个带有 DataPager 的 ListView。 ListView 绑定到代码隐藏中的 DataTable。
所以,假设我将寻呼机设置为显示 10 个页面链接,并且我有超过 10 页的数据。这 11 个按钮(10 页加上指向第 11 页的溢出省略号)工作得很好。 Next 和 Previous 链接也可以正常工作。
但是,一旦我单击省略号并转到第 11 页,链接仍然指向页面第一页的偏移量。也就是说,单击第 12 页会将我转储到第 3 页(第 1 页是新的第 10 页省略号,第 2 页是第 11 页)。与下一个和上一个链接以及所有其他数字链接相同。
查看浏览器控制台中的代码,看起来即使是(其他人的)正在工作的寻呼机也会在链接的 __doPostBack 调用中为每一页页面打印相同的参数。所以,我不确定寻呼机是如何保持其整体偏移量的,因为页面的每一页都只给出相对于它们自身的偏移量。
除了将我的 ListView 绑定到代码隐藏中的 DataTable 而不是 DataSourceID 属性中的数据源之外,我真的不知所措。但是,寻呼机确实对第一页的页面进行了正确的分页,所以我认为这不仅仅是我的绑定导致它失败。
<asp:ListView ID="lvProjects" runat="server" GroupPlaceholderID="groupPlaceHolder"
ItemPlaceholderID="itemPlaceHolder" OnPagePropertiesChanging="OnPagePropertiesChanging"
DataKeyNames="ProjectID" OnPreRender="lvProjects_PreRender">
<LayoutTemplate>
<asp:DataPager ID="DataPager" runat="server" PagedControlID="lvProjects" PageSize="10">
<Fields>
<asp:NextPreviousPagerField ButtonType="Link" ShowFirstPageButton="true" ShowPreviousPageButton="true" ShowNextPageButton="false"
FirstPageText="|<<" PreviousPageText="<" RenderNonBreakingSpacesBetweenControls="true" />
<asp:NumericPagerField ButtonType="Link" ButtonCount="10" RenderNonBreakingSpacesBetweenControls="true" />
<asp:NextPreviousPagerField ButtonType="Link" ShowNextPageButton="true" ShowLastPageButton="true" ShowPreviousPageButton="false"
NextPageText=">" LastPageText=">>|" RenderNonBreakingSpacesBetweenControls="true" />
</Fields>
</asp:DataPager>
<br />
<br />
<table class="myGrid projects-table">
<tbody>
<asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
</tbody>
</table>
</LayoutTemplate>
<ItemTemplate>
...
</ItemTemplate>
</asp:ListView>
.
protected void OnPagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
{
var pager = (DataPager)lvProjects.FindControl("DataPager");
pager.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
lvProjects.DataSource = Projects;
lvProjects.DataBind();
}
查看 e.StartRowIndex 也将显示页面偏移量的第一页(即第 12 页将 return“20”,@10 items/page)。
这显然是因为用 SessionPageStatePersister 覆盖了 PageStatePersister:
protected override PageStatePersister PageStatePersister
{
get
{
return new SessionPageStatePersister(this);
}
}
我猜 DataPager 将其整体偏移量存储在页面状态中,当我更改页面状态的行为时,它以某种方式丢失了。
删除覆盖允许它按预期工作。
我有一个带有 DataPager 的 ListView。 ListView 绑定到代码隐藏中的 DataTable。
所以,假设我将寻呼机设置为显示 10 个页面链接,并且我有超过 10 页的数据。这 11 个按钮(10 页加上指向第 11 页的溢出省略号)工作得很好。 Next 和 Previous 链接也可以正常工作。
但是,一旦我单击省略号并转到第 11 页,链接仍然指向页面第一页的偏移量。也就是说,单击第 12 页会将我转储到第 3 页(第 1 页是新的第 10 页省略号,第 2 页是第 11 页)。与下一个和上一个链接以及所有其他数字链接相同。
查看浏览器控制台中的代码,看起来即使是(其他人的)正在工作的寻呼机也会在链接的 __doPostBack 调用中为每一页页面打印相同的参数。所以,我不确定寻呼机是如何保持其整体偏移量的,因为页面的每一页都只给出相对于它们自身的偏移量。
除了将我的 ListView 绑定到代码隐藏中的 DataTable 而不是 DataSourceID 属性中的数据源之外,我真的不知所措。但是,寻呼机确实对第一页的页面进行了正确的分页,所以我认为这不仅仅是我的绑定导致它失败。
<asp:ListView ID="lvProjects" runat="server" GroupPlaceholderID="groupPlaceHolder"
ItemPlaceholderID="itemPlaceHolder" OnPagePropertiesChanging="OnPagePropertiesChanging"
DataKeyNames="ProjectID" OnPreRender="lvProjects_PreRender">
<LayoutTemplate>
<asp:DataPager ID="DataPager" runat="server" PagedControlID="lvProjects" PageSize="10">
<Fields>
<asp:NextPreviousPagerField ButtonType="Link" ShowFirstPageButton="true" ShowPreviousPageButton="true" ShowNextPageButton="false"
FirstPageText="|<<" PreviousPageText="<" RenderNonBreakingSpacesBetweenControls="true" />
<asp:NumericPagerField ButtonType="Link" ButtonCount="10" RenderNonBreakingSpacesBetweenControls="true" />
<asp:NextPreviousPagerField ButtonType="Link" ShowNextPageButton="true" ShowLastPageButton="true" ShowPreviousPageButton="false"
NextPageText=">" LastPageText=">>|" RenderNonBreakingSpacesBetweenControls="true" />
</Fields>
</asp:DataPager>
<br />
<br />
<table class="myGrid projects-table">
<tbody>
<asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
</tbody>
</table>
</LayoutTemplate>
<ItemTemplate>
...
</ItemTemplate>
</asp:ListView>
.
protected void OnPagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
{
var pager = (DataPager)lvProjects.FindControl("DataPager");
pager.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
lvProjects.DataSource = Projects;
lvProjects.DataBind();
}
查看 e.StartRowIndex 也将显示页面偏移量的第一页(即第 12 页将 return“20”,@10 items/page)。
这显然是因为用 SessionPageStatePersister 覆盖了 PageStatePersister:
protected override PageStatePersister PageStatePersister
{
get
{
return new SessionPageStatePersister(this);
}
}
我猜 DataPager 将其整体偏移量存储在页面状态中,当我更改页面状态的行为时,它以某种方式丢失了。
删除覆盖允许它按预期工作。