Как можно обрабатывать события страницы из пользовательского контроля? (VB.net) - PullRequest
4 голосов
/ 25 февраля 2009

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 25 февраля 2009

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

В любом случае, в вашем Init UserControl Init вы могли бы явно назначить свой метод Page_PreLoad в качестве обработчика события PreLoad свойства PageControl UserControl вместо использования синтаксиса «Handles» в объявлении метода. Ваш пример пытается назначить обработчик события для объекта UserControl для события, которое объект UserControl не вызывает. Как вы заметили, UserControl не наследуется от Page, где и происходит событие PreLoad. Однако UserControl содержит объект Page в качестве одного из его свойств, что, в свою очередь, представляет PreLoad как событие, которому вы можете назначить обработчик. В любом случае, это компилирует и приближает к тому, что звучит так, как вы ищете (используя комментарии в стиле C для сохранения подсветки синтаксиса ОМУ).

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

Я не уверен, служит ли это вашей цели - как указывал Стивен Райтон выше, может быть лучший способ с одним из различных событий в жизненном цикле страницы. Однако, основываясь на том, что он сказал, это должно работать, потому что вызывается OnInit элемента управления, в котором выполняется назначение обработчика события, затем вызывается событие OnLoad страницы, а затем выполняется обработчик события в элементе управления.

2 голосов
/ 25 февраля 2009

Если вы не используете опцию Джейсона, то вы либо застряли, выполняя действие в событии INIT (до загрузки Viewstate) или в событии PAGE LOAD.

Мой вопрос: есть ли причина, по которой действие должно выполняться в PreLoad, а не в событиях Load?

Помните, что на самом деле Preload действительно выполняет загрузку данных Viewstate и PostBack в различные элементы управления (больше информации о жизненном цикле ).

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

0 голосов
/ 25 февраля 2009

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

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