Я создал пользовательский класс подкачки - Pagger
- для реализации подкачки для элементов управления списками.
сейчас, Pagger
объект генерирует ASP:Panel
, который содержит навигационные btns - ASP:LinkButton
- который отвечает за навигацию, каждый сгенерированный btn хранит внутри него pageNumber
, который он должен перейти к
Пример:
Для улучшения подкачки я использовал Ajax - ASP:UpdatePanel
- для окружения paging panel
,
теперь на каждом btn's click
происходит PostBack
, поэтому я воссоздаю все события страницы btns
in OnPreInit
, чтобы они снова были доступны - это очевидно, и это не вопрос -
protected override void OnPreInit(EventArgs e)
{
Pagger p = new Pagger(itemsCount, itemsPerPage);
//Here the pager reads from viewstate to know
//which pageNumber is the currentPage and generates btns according to it
p.GeneratePaggerPanel(CurrentPageNumber);
Panel1.Controls.Add(p.PaggerPanel);
//link the LinkBtn to event handler to be executed upon clicking
foreach (Control c in p.PaggerPanel.Controls)
{
if (c is LinkButton)
{
((LinkButton)c).Click += Button1_Click;
}
}
base.OnPreInit(e);
}
Теперь, чтобы узнать, какой pageNumber
является currentPageNumber
, я пошел, чтобы сохранить его в ViewState
public uint CurrentPageNumber
{
get
{
if (ViewState["CurrentPageNumber"] != null)
return (uint)ViewState["CurrentPageNumber"];
return 1;
}
set
{
ViewState["CurrentPageNumber"] = value;
}
}
protected void Button1_Click(object sender, EventArgs e)
{
CurrentPageNumber = ((PaggerLinkButton)sender).Tag;
}
но btnEvent Click
срабатывает после page_load
, это означает, что ViewState
не будет доступен, когда re-creating
pager btns
в OnPreInit
событие
как я могу установить значение ViewState
, прочитав pressed btn's value
перед инициализацией pager btns panel
, чтобы пейджер мог использовать currentPageNumber
в том же PostBack
и не ждать, чтобы сделать еще один PostBack
?
Я также прочитал Обзор жизненного цикла страницы ASP.NET , но мне ничего не помогло.
P.S .: PaggerLinkButton
наследуется от LinkButton
с одним новым свойством Tag