Динамически добавленные элементы управления и AJAX - PullRequest
3 голосов
/ 06 марта 2009

Позвольте мне начать с указания на, это не простой вопрос, чтобы ответить. По крайней мере, это почти невозможно найти ответ.

В UpdatePanel я динамически добавляю некоторые элементы управления в мой элемент управления панели.

List<Showing> showings = cBLL.GetShowings(tenant.Id);

        int j = 1;
        foreach(Showing showing in showings)
        {
            UserControl uc = (UserControl)Page.LoadControl("Controls/BookShowing.ascx");
            uc.ID = "showing_" + j;
            uc.Visible = true;
            ((BookShowing)uc).SetShowing(showing);
            pnl_showings.Controls.Add(uc);
            j++;
        }

Все это происходит в событии кнопки, запущенном из управляющего асихрона.

Ниже этих полей я добавляю код, показанный выше, у меня есть кнопка. Кнопка также находится в панели обновления. Эта кнопка называется: btn_editShowings

Теперь, когда я перехожу к обработчику событий btn_editShowings_Click, мои добавленные динамические элементы управления больше не существуют. Я также пытался поймать их в OnInit, но их там тоже нет.

Как F ... возможно ли когда-либо получить данные из динамически добавленных элементов управления ??? Есть ли в любом случае, и мне все равно, насколько паршиво это работает или что-то еще, чтобы решить это?

UPDATE

Теперь я попытался сделать следующее, которое должно работать при запуске Init до LoadViewState из того, что я прочитал.

Я добавляю некоторые элементы управления динамически в событие Button

    protected void Button2_Click(object sender, EventArgs e)
    {    
         for (int i = j; i < showno + 4; i++)
                {
                    UserControl uc = (UserControl)Page.LoadControl("Controls/BookShowing.ascx");
                    uc.ID = "showing_" + i;
                    uc.Attributes.Add("runat", "Server");
                    uc.EnableViewState = true;
                    uc.Visible = true;
                    pnl_showings.Controls.Add(uc);
                }
          UpdatePanel1.Update();
    }

И я сделал то же самое в своей функции инициализации: защищенное переопределение void OnInit (EventArgs e) { base.OnInit (е);

        if (Session["ShowingsCount"] != null)
        {
            int noOfUCs = (int)Session["ShowingsCount"];
            for (int i = 1; i < noOfUCs; i++)
            {
                UserControl uc = (UserControl)Page.LoadControl("Controls/BookShowing.ascx");
                uc.ID = "showing_" + i;
                uc.Attributes.Add("runat", "Server");
                uc.EnableViewState = true;
                uc.Visible = true;
                pnl_showings.Controls.Add(uc);
            }
            UpdatePanel1.Update();
        }
    }

Но когда я попробую это:

FindControl("showing_1").Visible = false;

Я получил исключение нулевой ссылки.

С наилучшими пожеланиями Настоящий Напстер, встревоженный еще раз.

Ответы [ 2 ]

2 голосов
/ 06 марта 2009
  1. Когда вы добавляете элементы управления в первый раз, следите за количеством элементов управления, которые необходимо воссоздать в состоянии просмотра.
  2. На каждом постбеке после этого убедитесь, что вы добавляете это количество элементов управления обратно на страницу с теми же идентификаторами в методе LoadViewState.

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

0 голосов
/ 09 марта 2009
BookShowing bs = (BookShowing)UpdatePanel1.FindControl("showing_" + i);

Было решение, переопределение OnInit действительно сработало, это я выбрал неправильный способ управления пользователями.

Закрыто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...