Предыстория, я заново изобретаю нумерацию страниц, чтобы обработать вызов источника данных, на котором я могу получить только количество результатов и текущую страницу.Я знаю, на какой странице я нахожусь, я знаю, сколько страниц.Я хочу визуализировать ретранслятор с текущим выбранным элементом всегда посередине, поэтому я собираюсь перестраивать список здесь при каждой обратной передаче.По какой-то причине ни одно из моих событий нажатия не срабатываетДругие ответы на сайте исправляют это, заявляя: «Не перестраивать список при обратной передаче», но это именно то, что мне нужно сделать здесь.
Мой код ascx выглядит следующим образом:
<asp:Repeater ID="PaginationRepeater" runat="server"
OnItemDataBound="PaginationRepeater_ItemDataBound">
<ItemTemplate>
<li>
<asp:LinkButton ID = "PaginationLink" runat="server"
Text = '<%#Container.DataItem.ToString()%>'
CommandArgument = '<%#Container.DataItem.ToString()%>'
CommandName="WasClicked"
OnCommand="PaginationLink_Command"
OnClick="PaginationLink_Click">
</asp:LinkButton>
</li>
</ItemTemplate>
</asp:Repeater>
Свойства в игре:
public int ResultCount { get; set; }
public bool ShowPaging { get; set; }
public int PreviousPageNumber { get; set; }
public int CurrentPageNumber { get; set; }
public List<int> PageNumbers { get; set; }
public int NextPageNumber { get; set; }
Команды PaginationLink_Command и PaginationLink_Click на данный момент просто генерируют не реализованное исключение.Надеюсь, в какой-то момент я смогу поразить эти строки кода.
private void Link_Command(object sender, CommandEventArgs e)
{
throw new NotImplementedException();
}
private void Link_Click(object sender, EventArgs e)
{
throw new NotImplementedException();
}
protected void PaginationLink_Command(object sender, CommandEventArgs e)
{
throw new NotImplementedException();
}
protected void PaginationLink_Click(object sender, EventArgs e)
{
throw new NotImplementedException();
}
Надеюсь, кто-то хорошо разбирается в веб-формах и готов помочь.
Обновление: Ответ на вопрос, как я загружаю данные в ретранслятор:
public override void OnContentLoaded()
{
base.OnContentLoaded();
Page.LoadComplete += new EventHandler(Page_LoadComplete);
}
protected void Page_LoadComplete(object sender, EventArgs e)
{
int currentPage = 1; // TODO: get from pagination.
int productCount = LoadProducts(currentPage);
LoadPager(currentPage, productCount);
}
public void LoadPager(int currentPage, int resultCount)
{
int itemsPerPage = 9;
int displayedPages = 9;
ShowPaging = resultCount > itemsPerPage;
if (!ShowPaging)
return;
int maxPages = (int)Math.Ceiling((decimal)(resultCount / itemsPerPage)) + 1;
if (currentPage > maxPages)
currentPage = maxPages;
int start = Enumerable.Max(new[] { currentPage - (displayedPages / 2), 1 });
int end = Enumerable.Min(new[] { start + displayedPages, maxPages });
CurrentPageNumber = currentPage;
PreviousPageNumber = currentPage - 1 > 1 ? currentPage - 1 : 1;
NextPageNumber = currentPage + 1 <= maxPages ? currentPage + 1 : maxPages;
PageNumbers = Enumerable.Range(start, end - start + 1).ToList();
PaginationRepeater.DataSource = PageNumbers;
PaginationRepeater.DataBind();
}
TLDR заключается в том, что я выполняю привязку во время события LoadComplete.