ASP.Net:DataPager Control总是落后于分页

And*_*ech 25 c# asp.net listview datapager

采用以下示例...一个带有a ListView和a 的页面,DataPager用于分页ListView:

代码背后:

protected void Page_Load(object sender, EventArgs e)
{
    MyList.DataSource = GetSomeList();
    MyList.DataBind();
}
Run Code Online (Sandbox Code Playgroud)

资源:

<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>
Run Code Online (Sandbox Code Playgroud)

问题DataPager在于它始终是绑定的后盾.

例如,当页面加载它在页码1时.然后当您单击第3页时,它在回发后保留在第1页.然后你点击第5页,在回发后它在第3页找到自己...然后你点击第6页,它在第5页找到自己......依此类推.

为什么分页不按预期工作?

And*_*ech 33

问题是由于Page_Load事件发生了绑定.

对于这项工作如预期,结合需求在发生DataPagerOnPreRender事件,而不是在Page_Load.

资源:

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

<Fields>
        <asp:NumericPagerField  />
    </Fields>
</asp:DataPager>
Run Code Online (Sandbox Code Playgroud)

代码背后:

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();    
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这是另一个ASP.net怪癖,没有大量记录. (4认同)

Jay*_*y S 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>
Run Code Online (Sandbox Code Playgroud)

代码背后:

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();
}
Run Code Online (Sandbox Code Playgroud)