25

举个例子……一个带有 aListView和 a的页面DataPager用于对 的数据进行分页ListView

代码背后:

protected void Page_Load(object sender, EventArgs e)
{
    MyList.DataSource = GetSomeList();
    MyList.DataBind();
}

来源:

<asp:ListView ID="MyList" runat="server">
    <% //LayoutTemplate and ItemTemplate removed for the example %>
</asp:ListView>

<asp:DataPager ID="ListPager" PagedControlID="MyList" runat="server" PageSize="10">
    <Fields>
        <asp:NumericPagerField  />
    </Fields>
</asp:DataPager>

的问题DataPager在于它总是落后于绑定。

例如,当页面加载时它位于第 1 页。然后当您单击第 3 页时,它在回发后停留在第 1 页。然后你点击第 5 页,在回发后它发现自己在第 3 页......然后你点击第 6 页,它发现自己在第 5 页......等等。

为什么分页没有按预期工作?

4

6 回答 6

34

解决方案

问题是由于Page_Load事件上发生的绑定。

为了使其按预期工作,绑定需要在DataPager'OnPreRender事件中发生,而不是在Page_Load.

来源:

<asp:DataPager ID="ListPager" PagedControlID="MyList" runat="server" PageSize="10"
    OnPreRender="ListPager_PreRender">

<Fields>
        <asp:NumericPagerField  />
    </Fields>
</asp:DataPager>

代码背后:

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();    
}
于 2009-07-15T09:48:34.077 回答
6

我遇到了同样的问题,但每次在 datapager prerender 上绑定对我来说不是一个选项。相反,我可以通过仅在分页发生时绑定来完成许多相同的事情。此解决方案可用作 Andreas 的预渲染解决方案的替代方案。以下对我有用:

通过附加到 ListView 的 PagePropertiesChanged 事件,我能够纠正分页问题,​​而无需绑定数据分页器的每个预呈现。

注意:大多数数据分页器属性都设置在皮肤文件中,这就是它们不在标记中的原因。

标记:

<asp:DataPager ID="ListPager" runat="server" PagedControlID="MyList" />
<asp:ListView ID="MyList" runat="server">
    <% //LayoutTemplate and ItemTemplate removed for the example %>
</asp:ListView>

代码背后:

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();
}
于 2009-10-01T21:03:41.253 回答
1

您缺少数据分页器上的 OnPreRender 事件!

于 2010-11-08T02:21:59.757 回答
0

以下作品对我来说是完美的。

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

<asp:ListView ID="rs" runat="server" onpagepropertieschanging="rs_PagePropertiesChanging">
于 2014-04-13T21:15:51.277 回答
0

或者,如果您正在构建一个仅包含 ListView 的用户控件,您可以简单地将寻呼机事件处理程序指向该Page_Load方法,因为 Page_Load 方法没有运行其他任何东西:

<asp:DataPager ID="ListPager" PagedControlID="MyList" runat="server" PageSize="10"
OnPreRender="Page_Load">
于 2015-03-16T12:34:40.440 回答
-2

在页面加载中,您应该将代码放在 if (!IsPostBack) { } 之间

它会解决你的问题。

于 2011-07-04T15:50:42.067 回答