ASP.Net: DataPager Control всегда на шаг впереди с поиском - PullRequest
25 голосов
/ 15 июля 2009

Возьмите следующий пример ... страницу с 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 ... и так далее, и так далее.

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

Ответы [ 6 ]

33 голосов
/ 15 июля 2009

Решение

Проблема связана с привязкой к событию 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();    
}
6 голосов
/ 02 октября 2009

Я столкнулся с этой же проблемой, но привязка каждый раз при предварительном отображении datapager не была для меня вариантом. Вместо этого я смог выполнить почти то же самое, связавшись только тогда, когда произошла подкачка. Это решение может быть использовано в качестве альтернативы предварительному решению Андреаса. У меня сработало следующее:

Прикрепив к событию PagePropertiesChanged в ListView, я смог исправить проблему подкачки без необходимости связываться с каждым предварительным отображением пейджера данных.

ПРИМЕЧАНИЕ: Большинство свойств пейджера данных настраиваются в файле обложки, поэтому их нет в разметке.

Markup:

<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();
}
1 голос
/ 08 ноября 2010

Вы пропустили событие OnPreRender в хранилище данных!

0 голосов
/ 16 марта 2015

В качестве альтернативы, если вы создаете пользовательский элемент управления , содержащий только ListView, вы можете просто указать обработчику событий пейджера на метод Page_Load, поскольку метод Page_Load больше ничего не выполняет:

<asp:DataPager ID="ListPager" PagedControlID="MyList" runat="server" PageSize="10"
OnPreRender="Page_Load">
0 голосов
/ 14 апреля 2014

Следующие работы идеально подходят для меня.

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">
0 голосов
/ 04 июля 2011

в загрузке страницы вы должны поместить код между if (! IsPostBack) { }

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

...