Считать значение динамического элемента управления после PostBack для пользовательской подкачки - PullRequest
0 голосов
/ 11 января 2012

Я создал пользовательский класс подкачки - Pagger - для реализации подкачки для элементов управления списками.

сейчас, Pagger объект генерирует ASP:Panel, который содержит навигационные btns - ASP:LinkButton - который отвечает за навигацию, каждый сгенерированный btn хранит внутри него pageNumber, который он должен перейти к

Пример:
enter image description here

Для улучшения подкачки я использовал 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

1 Ответ

0 голосов
/ 11 января 2012

У вас есть несколько вариантов (которые я могу обдумать).

  1. Замените метод Button1_click на стороне сервера обработчиком событий щелчка на стороне клиента для кнопок ссылок.Этот метод на стороне клиента должен установить значение страницы для скрытого элемента управления в форме.Обратите внимание, что вам не нужен пользовательский класс linkbutton с атрибутом tag.Просто установите значение страницы в коде обработчика onclick на стороне клиента (что-то вроде OnClick = 'setPageNo (x); return true;').Затем в OnPreInit получите текущий номер элемента из скрытого элемента управления.

  2. Я не уверен, почему вы воссоздаете элемент управления PaggerPanel в каждой обратной передаче (в отличие от использования viewstate), но вы должны иметь возможностьотделить логику в методе GeneratePaggerPanel от (a) создания панели myPanel = p.GeneratePaggerPanel (), которая выполняется в OnPreInit, и (b) изменений для текущей страницы p.FixPaggerPanel (myPanel, CurrentPageNo), которая выполняется в методе Button1_click.

Надеюсь, это поможет, ура, Ник

...