Подтвердить что ты не робот

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... и т.д. И т.д.

Почему работа пейджинга не работает должным образом?

4b9b3361

Ответ 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) { }

Это решит вашу проблему.