Добавьте динамические элементы управления в ASP.NET, есть ли разница между 1.1 и 2.0?

StackOverflow https://stackoverflow.com/questions/1708264

Вопрос

Я почти уверен, что во времена ASP.NET 1.0/1.1 элементы управления, созданные во время выполнения, необходимо было добавлять до Page_Load мероприятие Жизненный цикл страницы (т.е.внутри Page_Init).

Вот одна статья Microsoft об этом (для .NET 1.0/1.1):
КАК:Динамическое создание элементов управления в ASP.NET:

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

Однако в нескольких постах здесь кажется, что вышеизложенное уже не так.Элементы управления добавлены внутри Page_Load кажется, работает для всех остальных.Некоторые из сообщений включают в себя:
создание динамического управления в asp.net
Viewstate - полнейшая путаница.

Я попробовал это сам, и это действительно сработало, хотя я не провел достаточно тестов, чтобы выявить какое-либо неожиданное поведение.

Как и Page_Load безопасный этап для добавления динамических элементов управления?Или это только для .NET 2.0 и выше?

Это было полезно?

Решение

Я изучал это с помощью Reflector, и класс Control действительно ускоряет работу, когда вы добавляете их динамически, независимо от того, когда вы их добавляете.Он делает все — загружает состояние просмотра/контроля, вызывает события обратной передачи, вызывает обработчики событий и т. д.Я не знаю, было ли это по-другому во времена ASP.NET 1.x, но в версии 2.0 и выше это так.

Что касается "опасностей" - есть некоторые ошибки, о которых может споткнуться неопытный пользователь, поэтому рекомендуется добавить их в Page_Init или раньше.(Обратите внимание, что событие PreInit применяется только к самой странице, а не к главной странице или подэлементам управления).Из головы (я уверен, что их может быть еще несколько):

  • По умолчанию состояние представления загружается позиционно.То есть он игнорирует идентификаторы элементов управления и просто учитывает размещение элементов управления в дереве при загрузке состояния представления.Если ваши динамические элементы управления присутствовали при сериализации состояния просмотра, но не присутствовали при его десериализации, неправильный элемент состояния просмотра может быть назначен неправильному элементу управления, что приведет к возникновению исключений.Это можно изменить некоторыми настройками, правда мне сейчас лень их искать.
  • Поскольку «ускорение» происходит при добавлении динамического элемента управления на страницу, порядок некоторых событий может быть неожиданным.Например, если вы добавите элемент управления TextBox на страницу в событии Page_PreRender, событие Changed TextBox произойдет тут же.Если ваш код обработчика событий зависит от события, происходящего с остальными из них до PreRender, то вы облажались.

Другие советы

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

Фактически, если вы проверите версию .Net 2.0 ссылки на жизненный цикл страницы, которую вы опубликовали, вы все равно найдете эту цитату под событием PreInit:

Используйте это событие для следующего:...Создайте или воссоздайте динамические элементы управления.

Обработчик событий Page_Load — приемлемое место для добавления элементов управления.Если вы перечитаете свою заметку, вы заметите, что они это утверждают.

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

Если в статье ASP.NET 2.0, на которую вы ссылаетесь, в разделе «Догоняющие события для добавленных элементов управления» обсуждается, как добавленные элементы управления ускоряются вместе со страницей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top