Доступ к элементам управления, создаваемым динамически (C#)
В моем коде (C#) я динамически создал несколько списков RadioButtonList с большим количеством RadioButton в каждом из них. Я поместил все элементы управления на определенную панель. Что мне нужно знать, так это как получить доступ к этим элементам управления позже, поскольку они не созданы в файле.aspx (с помощью перетаскивания из панели инструментов)?
Я попробовал это:
foreach (Control child in panel.Controls)
{
Response.Write("test1");
if (child.GetType().ToString().Equals("System.Web.UI.WebControls.RadioButtonList"))
{
RadioButtonList r = (RadioButtonList)child;
Response.Write("test2");
}
}
"test1" и "test2" не отображаются на моей странице. Это означает, что что-то не так с этой логикой. Любые предложения, что я мог сделать?
3 ответа
Вы должны воссоздавать свои элементы управления после каждой обратной передачи.
ASP.NET не имеет состояния, то есть когда вы отправляете страницу обратно на сервер, ваши динамически созданные элементы управления больше не будут частью страницы.
На прошлой неделе мне пришлось еще раз преодолеть эту ситуацию.
Что я сделал? Я сохранил данные, которые я использовал для создания элементов управления внутри объекта Session. В методе PageLoad я передал те же данные для воссоздания динамических элементов управления.
Я предлагаю: написать метод для создания динамических элементов управления.
На методе PageLoad проверьте, не является ли это обратной передачей...
if(Page.IsPostBack)
{
// Recreate your controls here.
}
Действительно важная вещь: назначьте уникальные идентификаторы своим динамически созданным элементам управления, чтобы ASP.NET мог воссоздать элементы управления, связывающие их существующие обработчики событий, восстановив их ViewState и т. Д.
myControl.ID = "myId";
Мне было трудно узнать, как это работает. Когда вы узнаете, у вас есть сила в руках. Динамически создаваемые элементы управления открывают новый мир возможностей.
Как сказал Фрэнк: вы можете использовать ключевое слово "is" таким образом, чтобы облегчить свою жизнь...
if(child is RadioButtonList)
Примечание: стоит упомянуть страницу обзора жизненного цикла страницы ASP.NET на MSDN для дальнейшего использования.
Когда вы делаете это в своем коде? Убедитесь, что вы делаете это в нужное время в жизненном цикле ASP, иначе ваши элементы управления еще не существуют: http://msdn.microsoft.com/en-us/library/ms178472.aspx
Я не думаю, что создание элементов управления в PageLoad - это сразу, сначала жизненный цикл asp.net начинается с инициализации, загрузки данных ViewState, загрузки PostData; Загрузка объекта и т. Д.
если вы создадите элементы управления в Page_Load, вы потеряете ViewState, события и т. д.
Сразу же делается в PageInit, или, если это элемент управления (OnInit).
Следующая трудность заключается в том, что в PageInit у вас нет ViewState Available, если вам нужно восстановить количество объектов, которые вам нужны для хранения некоторого контекста / информации в скрытом поле ant, а затем извлечь эту информацию в PageInit, создать объекты и вуаля!
Пример:
представьте, что вам нужно создать 1..N TextBoxes, вы создаете скрытое html поле (не с runat=server), например NumberOfTextBoxes.
Когда вы выполняете PageInit Code: вы извлекаете значение, например, numberOfTextBoxes = Request.Form["NumberOfTextBoxes"], затем вы создаете TextBoxes.
Помните, что самое важное - это соответствовать количеству и порядку существующих элементов управления, хранящихся в ViewState.