2015-06-19 5 views
0

У меня проблемы с динамическими пользовательскими элементами управления в ASP.NET Web Forms (я знаю, что они сосут, но мой проект опирается на них). Так кратко мой случай:Динамические пользовательские элементы управления сохраняют состояние по обратной передаче

  1. У меня есть DropDownList на моей странице ASPX с несколькими вариантами выбора из (для каждого из них, у меня есть другое управление пользователя для визуализации);
  2. Когда я выбираю один, пользовательский элемент управления для этого параметра оказывается ниже в заполнитель внутри UpdatePanel:

enter image description here

  1. В коде позади в методе DropDownList SelectedIndexChanged я создаю экземпляр пользователя с помощью Page.LoadControl (string virtualPath), а затем я добавляю его в элементы управления заполнителя:

    selectedFilters.Controls.Add(myUserControlObject);

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

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

0

Вам нужно будет добавить каждый динамически добавленный элемент управления при каждом обратном вызове, который обычно лучше всего делать в событии Page_PreLoad, чтобы динамически добавленный элемент управления возвращался в его последнее состояние на основе ViewState и размещенных значений.

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

ViewState["DynamicControl1"] = true; 

, а затем в вашем случае Page_PreLoad ...

if ((bool)ViewState["DynamicControl1"]) 
{ 
    //Add your control again here, 
    //possibly duplicated from your DropDownList SelectedIndexChanged handler 
} 

В зависимости от настроек ViewState, ASP.NET автоматически заполнит список элементов DropDownList и выбранное значение, если элемент управления добавлен в нужную часть жизненного цикла страницы. Если вы отключили ViewState, вам нужно будет повторно заполнить элементы списка, когда вы добавите элемент управления в событие Page_PreLoad.

Обратите внимание, что важно, чтобы динамически добавленный элемент управления имел одинаковый идентификатор для каждой обратной передачи, поэтому, если у вас есть проблемы, попробуйте установить ClientIDMode на «AutoID».

Смежные вопросы