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

Я уверен, что еще во времена 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 и выше?

Ответы [ 3 ]

3 голосов
/ 10 ноября 2009

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

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

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

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

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

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

1 голос
/ 10 ноября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...