DataPager не перечисляет дальше, чем 2-я страница
DataPager
имеет какое-то странное поведение.
Итак, чтобы определить проблему, у меня есть DataPagerReapeater
с информацией. И у меня есть DataPager
, который я сделал, чтобы работать вместе. У меня 3 страницы, но DataPager
имеет какое-то странное поведение.
Когда я на первой странице и нажимаю на следующую, она переходит на 2-ую, все в порядке. Когда я снова нажимаю "Далее", он выполняет обратную передачу, но не переходит на 3-ю страницу. Последнее и первое тоже отлично работает.
Но когда я нахожусь на второй странице и нажимаю на следующую, она не переместится на третью страницу, а останется на второй. То же самое, если я вручную нажимаю на третью страницу и нажимаю предыдущую, она переходит на первую страницу.
Я действительно не понимаю, почему.
Здесь DataPager
:
<asp:DataPager ID="DataPager1" PagedControlID="ReapeaterCSGator" PageSize="5"
runat="server" onprerender="DataPager1_PreRender">
<fields>
<asp:NextPreviousPagerField ButtonType="Link" ShowFirstPageButton="True" FirstPageText="<< First"
ShowNextPageButton="False" ShowPreviousPageButton="False" />
<asp:NextPreviousPagerField ButtonType="Link" ShowFirstPageButton="False" FirstPageText="< Previous"
ShowNextPageButton="False" ShowPreviousPageButton="True" />
<asp:NumericPagerField />
<asp:NextPreviousPagerField ButtonType="Link" ShowLastPageButton="False" LastPageText="Next >"
ShowNextPageButton="True" ShowPreviousPageButton="False" />
<asp:NextPreviousPagerField ButtonType="Link" ShowLastPageButton="True" LastPageText="Last >>"
ShowNextPageButton="False" ShowPreviousPageButton="False" />
</fields>
</asp:DataPager>
Вот код, который я выполняю на PreRender:
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
IEnumerable<CollaborativeSpace> listCS = LoadCollaborativeSpaces();
// Binding the repeater with the list of documents
ReapeaterCSGator.DataSource = listCS;
ReapeaterCSGator.DataBind();
}
Итак, поведение действительно странное, и я понятия не имею, в чем может быть проблема.
Кто-нибудь еще сталкивался с такой проблемой?
ОБНОВЛЕНИЕ: Вот метод загрузки и что у меня там:
ResultPerPages = GetResultsPerPage();
DataPager2.PageSize = ResultPerPages;
DataPager1.PageSize = ResultPerPages;
//We initialize the pager repeater with the same value
ReapeaterCSGator.SetPageProperties(0, ResultPerPages, false);
//We add an handler on item data bound event for sub repeater
ReapeaterCSGator.ItemDataBound += ReapeaterCSGator_ItemDataBound;
//If the user is not post backing
if (!IsPostBack)
{
//We add choices on drop down list "Results per page"
foreach (int choice in NbResultsChoices)
{
NbResultsPerPage.Items.Add(new ListItem(choice + " results per page", choice.ToString(CultureInfo.InvariantCulture)));
}
//We get collaborative spaces from Sharepoint list
//IEnumerable<CollaborativeSpace> listCS = LoadCollaborativeSpaces();
//// Binding the repeater with the list of documents
//ReapeaterCSGator.DataSource = listCS;
ОБНОВЛЕНИЕ 2: Вот код позади SetPageProperties()
public void SetPageProperties(int startRowIndex, int maximumRows, bool databind)
{
ViewState["_startRowIndex"] =startRowIndex;
ViewState["_maximumRows"] = maximumRows;
if (TotalRows > -1)
{
if (TotalRowCountAvailable != null)
{
TotalRowCountAvailable(this, new PageEventArgs((int)ViewState["_startRowIndex"], (int)ViewState["_maximumRows"], TotalRows));
}
}
}
Этот компонент был использован здесь: http://www.codeproject.com/Articles/45163/Extend-Repeater-to-support-DataPager
ПРОБЛЕМА РЕШЕНА, кажется, что ретранслятор данных не был реализован правильно, теперь, когда я нашел источники, которые мог бы это исправить. В любом случае спасибо за помощь
1 ответ
Если я правильно прочитал ваш метод загрузки, вы переустанавливаете ретранслятор на страницу 1 на каждом Page_Load
,
Что происходит, это:
- В
Page_Load
, вы сбросили репитер на страницу 1 вSetPagerProperties()
вызов - Во время фазы отправки события управления, пейджер данных перемещается на следующую страницу относительно страницы 1:
- если вы используете "первую" и "последнюю" и конкретные страницы, все работает, потому что они не являются относительными изменениями
- "Далее" переходит на страницу после страницы 1, поэтому вы застряли на странице 2,
- "предыдущая" пытается перейти на страницу до 1, поскольку ее нет, она остается на 1.
Чтобы это исправить, прекратите инициализацию пейджера при каждой загрузке страницы. Либо избавьтесь от вызова - я не уверен, почему он есть, я использую его только для "сброса" ретранслятора, например, после того, как пользователь щелкнет заголовок столбца, чтобы отсортировать представление списка. Или переместите его в if (!IsPostback)
блок.