Как можно обрабатывать события страницы из пользовательского элемента управления? (VB.net)

Я хотел бы, чтобы некоторый код выполнялся на этапе «предварительной загрузки» жизненного цикла моего пользовательского элемента управления. Однако событие предварительной загрузки доступно только для объекта Page. Итак, я добавил в свой пользовательский элемент управления следующий метод:

Private Sub Page_PreLoad(ByVal sender As Object, ByVal e As System.EventArgs) Handles Page.PreLoad 

Однако я знаю, что получаю ошибку компиляции: «Для предложения Handles требуется переменная WithEvents, определенная в содержащем типе или в одном из его базовых типов».

Поскольку свойство Page унаследовано от UserControl, я не понимаю, как это легко сделать.

Любая помощь с благодарностью получена!

Ответов (3)

Решение

Прошу прощения за приведенный пример C#, но я не могу вспомнить, как это сделать в VB ...

Anyway, in your UserControl's Init you could explicitly assign your Page_PreLoad method as the handler for the PreLoad event of the UserControl's Page property instead of using the "Handles" syntax in the method declaration. What your example is doing is trying to assign an event handler to an event on the UserControl object for an event that the UserControl object doesn't raise. As you noted, UserControl doesn't inherit from Page, which is where the PreLoad event lives. UserControl does, however contain a Page object as one of its properties, which in turn exposes PreLoad as an event to which you can assign a handler. Anyway, this compiles and approaches what it sounds like you are looking for (using C-style comments to preserve WMD syntax highlighting).

Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
    // this assigns Page_PreLoad as the event handler 
    // for the PreLoad event of the Control's Page property
    AddHandler Me.Page.PreLoad, AddressOf Page_PreLoad
    MyBase.OnInit(e)
End Sub

Private Sub Page_PreLoad(ByVal sender As Object, ByVal e As System.EventArgs)
    // do something here
End Sub

I'm not sure if that serves your purpose--as Stephen Wrighton indicated above, there may be a better way with one of the different events in the page lifecycle. However, building on what he said, this should work because the control's OnInit is called in which the event handler assignment is made, then the Page's OnLoad event is raised and then the event handler within the control is executed.

Почему бы не создать метод, который выполняет все, что необходимо для предварительной загрузки, и не заставить вашу страницу вызывать этот метод?

Unless you go with Jason's option, then you're either stuck performing the action in the INIT event (which is before the Viewstate is loaded) or the PAGE LOAD event.

My question is: Is there any reason that the action must be performed in the PreLoad as opposed to the Load events?

Remember, the only thing that the Preload really does is load the Viewstate and PostBack data into the various controls (more info on the lifecycle).

Событие LOAD произойдет до каких-либо событий управления (например, щелчков кнопок), поэтому вы, вероятно, сможете нормально выполнить свое действие там. Единственная причина, по которой это не так, - это если вы не хотите, чтобы данные PostBack или Viewstate мешали вашему процессу (по любой возможной причине), а затем в этом случае вы можете использовать событие INIT.