Динамическое создание/загрузка пользовательского элемента управления работает только один раз!

protected void addMoreDay_btn_Click(object sender, EventArgs e)
        {
            Control OneMoreDay = LoadControl("~/controls/Days/DayAdd.ascx");
            Days_div.Controls.Add(OneMoreDay);
        }

Я динамически загружаю свой userControl в элемент div... но проблема в том, что он работает только один раз! .. Я имею в виду, что я нажимаю кнопку addMoreDay_btn, и она работает, затем я пытаюсь щелкнуть ее еще раз, она не создаст еще один экземпляр моего элемента управления!

Изменить

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


person Mazen Elkashef    schedule 16.07.2011    source источник
comment
Попробуйте добавить два элемента управления в эту функцию вместо одного. У него будет два, если вы сделаете это? Если нет, то проблема в другом (например, Div где-то стирается)   -  person Brian Webster    schedule 16.07.2011
comment
на самом деле это сложнее.. Речь идет о странице Life Cycle.. Я должен поместить все свои элементы управления в массив и указать количество экземпляров, которые будут созданы в событии PreInit.. Я нашел это видео (это сложно, и я пока не понимаю этого достаточно, чтобы построить это), но это все, что у меня есть на данный момент ›› asp.net/ajax/videos/   -  person Mazen Elkashef    schedule 16.07.2011


Ответы (1)


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

Попробуйте следующий код. Обратите внимание, что элементы управления добавляются в метод Page_Init:

protected void addMoreDay_btn_Click(object sender, EventArgs e)
{
    Control OneMoreDay = LoadControl("~/controls/Days/DayAdd.ascx");
    Days_div.Controls.Add(OneMoreDay);
    Session["MyControl"] += 1
}


protected void Page_Init(object sender, EventArgs e)
{
    for (int i = 1; i <= (int)Session["MyControl"]; i++) {
        Control OneMoreDay = LoadControl("~/controls/Days/DayAdd.ascx");
        Days_div.Controls.Add(OneMoreDay);        
    }
}

См. здесь

person NakedBrunch    schedule 16.07.2011
comment
Я только что понял, что они каким-то образом уничтожаются из-за цикла страницы и обратных передач ... но я не понимаю, почему код для создания элемента управления повторяется дважды, и есть ли тип переменной, которая будет длиться через обратные передачи. вместо переменной сеанса, потому что это объект, и я сталкиваюсь с некоторыми проблемами с ним в С#, плюс я не думаю, что будет оптимальным загрузить переменную сеанса в реальном приложении. что вы думаете? - person Mazen Elkashef; 16.07.2011
comment
Это не работает должным образом, потому что создает экземпляр, когда я обновляю страницу! - person Mazen Elkashef; 16.07.2011
comment
Насколько важно поддерживать ViewState для ваших элементов управления? Если он вам не нужен, то вы можете переместить код из метода Page_Init в событие addMoreDay_btn_Click. Однако, если вам нужно поддерживать состояние просмотра, вам придется добавить еще одну переменную сеанса, чтобы проверить, была ли обновлена ​​​​страница или нет. В любом случае, это определенно решаемая проблема. - person NakedBrunch; 16.07.2011
comment
под ViewState вы имеете в виду, что если пользователь обновил страницу или добавил еще один день, хочу ли я сохранить данные в уже созданных полях, если да, то да, это было бы здорово. но как я могу проверить, обновилась ли страница!? можете ли вы помочь с небольшим количеством кода или деталей - person Mazen Elkashef; 16.07.2011