ASP.Net : DataPager Control always a step behind with paging
以下面的例子...一个带有
代码隐藏:
1 2 3 4 5 | protected void Page_Load(object sender, EventArgs e) { MyList.DataSource = GetSomeList(); MyList.DataBind(); } |
来源:
1 2 3 4 5 6 7 8 | <% //LayoutTemplate and ItemTemplate removed for the example %> </asp:ListView> <Fields> </Fields> </asp:DataPager> |
例如,当页面加载时它位于第 1 页。然后当您单击第 3 页时,它在回发后停留在第 1 页。然后你点击第 5 页,回发后它在第 3 页上找到自己……然后你点击第 6 页,它在第 5 页上找到自己……依此类推。
为什么分页没有按预期工作?
解决方案
问题是由于发生在
要使其按预期工作,绑定需要在
来源:
1 2 3 4 5 6 7 | <asp:DataPager ID="ListPager" PagedControlID="MyList" runat="server" PageSize="10" OnPreRender="ListPager_PreRender"> <Fields> </Fields> </asp:DataPager> |
代码隐藏:
1 2 3 4 5 6 7 8 9 10 11 | protected void Page_Load(object sender, EventArgs e) { //Binding code moved from Page_Load //to the ListView's PreRender event } protected void ListPager_PreRender(object sender, EventArgs e) { MyList.DataSource = GetSomeList(); MyList.DataBind(); } |
我遇到了同样的问题,但每次在 datapager prerender 上绑定对我来说不是一个选项。相反,我可以通过仅在分页发生时绑定来完成许多相同的事情。此解决方案可用作 Andreas 的预渲染解决方案的替代方案。以下对我有用:
通过附加到 ListView 的 PagePropertiesChanged 事件,我能够纠正分页问题,??而无需绑定数据分页器的每个预呈现。
注意:大多数数据分页器属性都设置在皮肤文件中,这就是它们不在标记中的原因。
标记:
1 2 | <% //LayoutTemplate and ItemTemplate removed for the example %> </asp:ListView> |
代码隐藏:
1 2 3 4 5 6 7 8 9 10 11 12 13 | protected void Page_Load(object sender, EventArgs e) { MyList.PagePropertiesChanged += new EventHandler(MyList_PagePropertiesChanged); } /// <summary> /// Handles the situation where the page properties have changed. Rebind the data /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void MyList_PagePropertiesChanged(object sender, EventArgs e) { MyList.DataSource = GetSomeList(); MyList.DataBind(); } |
您错过了数据分页器上的 OnPreRender 事件!
或者,如果您正在构建一个仅包含 ListView 的用户控件,您可以简单地将寻呼机事件处理程序指向
1 2 | <asp:DataPager ID="ListPager" PagedControlID="MyList" runat="server" PageSize="10" OnPreRender="Page_Load"> |
以下作品对我来说是完美的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim ds As DataSet ds = SQLHELPER.ExecuteDataSet(CommandType.StoredProcedure,"sp_Locations") rs.EnableViewState = False rs.DataSource = ds rs.DataBind() End Sub Protected Sub rs_PagePropertiesChanging(ByVal sender As Object, ByVal e As PagePropertiesChangingEventArgs) 'set current page startindex, max rows and rebind to false Pager.SetPageProperties(e.StartRowIndex, e.MaximumRows, False) 'rebind List View rs.DataBind() End Sub |
在页面加载中,您应该将代码放在
如果(!IsPostBack)
{
}
它会解决你的问题。