ASP.Net: DataPager Control всегда шаг за шагом под пейджинг
Возьмем следующий пример... страницу с ListView
и 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... и т.д. И т.д.
Почему работа пейджинга не работает должным образом?
Ответы
Ответ 1
Решение
Проблема связана с привязкой, происходящей в событии 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 PreRender event
}
protected void ListPager_PreRender(object sender, EventArgs e)
{
MyList.DataSource = GetSomeList();
MyList.DataBind();
}
Ответ 2
Я столкнулся с этой же проблемой, но привязка каждый раз к datapager prerender не была для меня вариантом. Вместо этого я смог выполнить то же самое, связываясь только тогда, когда произошел пейджинг. Это решение может быть использовано в качестве альтернативы решению Prerender Андреасом. Для меня работали следующие:
Присоединившись к событию ListView PagePropertiesChanged, я смог исправить проблему подкачки без привязки на каждом prerender пейджера данных.
ПРИМЕЧАНИЕ. Большинство свойств пейджера данных настраиваются в файле скина, поэтому они не находятся в разметке.
Разметка:
<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();
}
Ответ 3
Вам не хватает события OnPreRender в датапастере!
Ответ 4
Следующие работы идеально подходят для меня.
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">
Ответ 5
В качестве альтернативы, если вы создаете Элемент управления пользователя, содержащий только ListView, вы можете просто указать обработчик события pager методу Page_Load
, поскольку метод Page_Load не работает ничем иным:
<asp:DataPager ID="ListPager" PagedControlID="MyList" runat="server" PageSize="10"
OnPreRender="Page_Load">
Ответ 6
в загрузке страницы вы должны поместить код между
if (! IsPostBack)
{
}
Это решит вашу проблему.