关于 c#:ASP.Net:DataPager 控件总是落后于分页

ASP.Net : DataPager Control always a step behind with paging

以下面的例子...一个带有ListView和一个DataPager的页面用于分页ListView的数据:

代码隐藏:

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>

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

例如,当页面加载时它位于第 1 页。然后当您单击第 3 页时,它在回发后停留在第 1 页。然后你点击第 5 页,回发后它在第 3 页上找到自己……然后你点击第 6 页,它在第 5 页上找到自己……依此类推。

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


解决方案

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

要使其按预期工作,绑定需要在 DataPager\\ 的 OnPreRender 事件中发生,而不是在 Page_Load 中发生。

来源:

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 的用户控件,您可以简单地将寻呼机事件处理程序指向 Page_Load 方法,因为 Page_Load 方法没有运行其他任何东西:

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)
{
}

它会解决你的问题。