Динамически изменять пользовательский элемент управления в ASP.Net - PullRequest
10 голосов
/ 12 июня 2009

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

В основном макет страницы такой:

Выпадающий список
<</strong> Пользовательский элемент управления создан на основе выпадающего списка >

У меня это наполовину работает ... элементы управления меняются при изменении выбора. В OnInit () я динамически создаю последний выбранный элемент управления (значение которого сохраняется в состоянии сеанса, поскольку ViewState недоступен в OnInit).

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

Вот метод SelectionChanged:

protected void SelectionChanged(object sender, EventArgs e)
{
    SelectedValue = int.Parse(DropDownList.SelectedValue);  //Store in Session
    Control userControl = GetSpecificUserControl(SelectedValue);
    PlaceHolder1.Controls.Clear();   // Remove old user control
    PlaceHolder1.Controls.Add(userControl);
}

Любые изменения, внесенные пользователем в новый элемент управления после выбора SelectionChanged, не сохраняются в следующем посте. Однако последующие постбэки сохраняются. В этот момент элемент управления создается в OnInit ().

Есть ли какой-нибудь способ принудительно вернуть правильный пост и ViewState при изменении элемента управления? Можно ли принудительно переинициализировать страницу после изменения элемента управления?

Ответы [ 4 ]

10 голосов
/ 12 июня 2009

Что вам нужно сделать, это сохранить последнее известное значение DropDownList в сеансе. Тогда:

OnInit:

  • Создать любой элемент управления, обозначенный сохраненным значением в сеансе

Событие SelectionChanged

  • Удалить все, что вы создали во время OnInit
  • Создание и добавление нового элемента управления на основе нового выбора DropDownList
  • Сохранить новый выбор DropDownList в сеансе

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

Динамическое управление может быть очень привередливым. Часто проще создать все элементы управления, которые вам могут понадобиться, и установить для их свойств Visible значение false. Таким образом, они вообще не отображаются в браузере. Затем установите Visible в true только для тех элементов управления, которые вам нужны, когда они вам нужны.

5 голосов
/ 12 июня 2009

Это классическая проблема «оторвать голову» с веб-формами ASP.Net. У вас есть несколько вариантов:

1) Это что-то вроде хака, поскольку он немного выходит за рамки предполагаемого жизненного цикла страницы, но, по моему опыту, это самый прямой способ решения проблемы. Когда страница отправляется обратно из выпадающего события, просто наберите Request["MyDropDownID"] для выбранного значения выпадающего элемента управления во время Init() - не ждите, пока событие OnMyDropDownChanged() настроит вашу страницу.

2) Реализуйте свою собственную обработку ViewState для ваших пользовательских элементов управления. Это требует копания в документации ViewState и переопределения ряда методов.

3) Решение Джоэла. Он побил меня этим, но я пытался получить первый пост: p

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

1 голос
/ 12 июня 2009

Если список параметров не слишком велик, вы можете просто визуализировать все пользовательские элементы управления статически и использовать JavaScript / jQuery, чтобы показать / скрыть соответствующие элементы управления на основе значения раскрывающегося списка (событие onchange js). Вы можете использовать раскрывающееся значение для извлечения соответствующих значений из пользовательских элементов управления при сохранении.

Вы избегаете проблем с динамическими элементами управления, предоставляете более отзывчивый пользовательский интерфейс при выборе из выпадающего списка (без обратной передачи) и т. Д. *

0 голосов
/ 12 июня 2009

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

...