Есть ли событие загрузки после страницы в ASP.net
есть ли событие, которое запускается после все Page_Load
события завершена?
как я могу иметь более одного
Page_Load
?
Когда у вас есть пользовательские элементы управления.
прежде чем моя страница сможет отображать, мне нужно, чтобы моя страница (и все встроенные элементы управления) инициализировали себя, выполнив их Page_Load
событий.
проблема, конечно, в том, что если я помещу код в Page_Load
обработчик:
MyPage.aspx
--> Page_Load
---> DoSomethingWithUserControl()
UserControl1.ascx
--> Page_Load
---> initialize ourselves now that viewstate has been restored
затем я начинаю доступ к моему UserControl1
контроль до готовности.
мне нужен способ запуска кода после все Page_Load
события уволили, но до любые события обратной передачи (например, события щелчка) уволили:
MyPage.aspx
--> Page_Load
UserControl1.ascx
--> Page_Load
---> initialize ourselves now that viewstate has been restored
MyPage.aspx
--> Page_AfterLoad
---> DoSomethingWithUserControl()
глядя на жизненный цикл страницы в MSDN, похоже, что нет способа вызвать событие после все Page_Loads были завершено:
есть ли способ поднять после после все Page_Loads завершены?
2 ответов
Page_LoadComplete
- это событие, которое возникает после загрузки всех элементов управления
помните, что Init
событие сначала запускается всеми дочерними элементами управления, и только когда все элементы управления были инициализированы,Init
событие страницы поднимается. The Load
событие работает наоборот, страница сначала поднимает Load
событие, а затем каждый дочерний элемент управления поднимает свой собственный Load
событие. В конце концов LoadComplete
поднимается. заметьте, что это верно только тогда, когда элементы создаются во время разработки, когда элементы создаются динамически они (к сожалению) не следуют этому подходить строго.
из MSDN:
если элементы управления создаются динамически во время выполнения или декларативно в шаблонах элементов управления с привязкой к данным, их события изначально не синхронизируются с событиями других элементов управления на странице. Например, для элемента управления, добавляемого во время выполнения, события Init и Load могут произойти намного позже в жизненном цикле страницы чем те же события для элементов управления, созданных декларативно. Таким образом, с момента создания экземпляра динамически добавляемые элементы управления и элементы управления в шаблонах вызывают события одно за другим, пока они не догонят событие, во время которого оно было добавлено в коллекцию элементов управления.
смотрим:
(источник: http://msdn.microsoft.com/en-us/library/ms178472.aspx)
изменить 1
для того, чтобы выполнить все ваши требования:
мне нужен способ запуска кода после запуска всех событий Page_Load, но до запуска любых событий обратной передачи (например, событий щелчка):
Я думаю, что самый простой способ-объявить пользовательское событие в пользовательском элементе управления и запустить его после загрузки элемента управления, а затем jus подпишитесь на это событие в своем ASPX
Контроль Пользователей
public event Action LoadCompleted = delegate { };
protected void Page_Load(object sender, EventArgs e)
{
this.LoadCompleted();
}
страница ASPX
protected void Page_Load(object sender, EventArgs e)
{
this.myUserControl.LoadCompleted += () =>
{
// do somethign interesting
this.lblMessage.Text = DateTime.Now.ToString();
};
}
Кажется, что на самом деле нет способа надежно получить ваш код для выполнения между временем, когда все (статически объявленные, см. комментарий Jupaols о динамически добавленных) элементах управления загружаются и временем, когда их события обратной передачи вызываются.
Я даже дошел до того, чтобы разобрать класс страницы с помощью reflector, и, насколько я мог судить, страница не вызывает никаких методов, которые вы могли бы использовать между этими временами.
поэтому для общего случая это выглядит так тебе просто не повезло.
но ваше утверждение
затем я начинаю получать доступ к моему элементу управления UserControl1, прежде чем он будет готов
сомнительна. К тому времени Page_Load
вызывается метод, состояние viewstate и control установлено для всех элементов управления (по крайней мере, статически объявленных). Поэтому, если у вас нет дополнительной инициализации состояния в методе OnLoad элемента управления, элемент управления готов к работе. Если у вас есть что-то происходит в OnLoad, тогда почему бы не заняться там возней?