簡體   English   中英

如何從用戶控件處理頁面事件? (VB.net)

[英]How can page events be handled from a usercontrol? (VB.net)

我想在我的用戶控件生命周期的“預加載”階段執行一些代碼。 但是,預加載事件僅在頁面 object 上可用。 所以,我在我的用戶控件中添加了以下方法:

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

但是,我知道會出現編譯錯誤:“Handles 子句需要在包含類型或其基類型之一中定義的 WithEvents 變量”

由於 Page 屬性是從 UserControl 繼承的,我看不出這是如何輕松完成的。

任何幫助都感激不盡!

我很抱歉給出了 C# 示例,但我不記得如何在 VB 中執行此操作...

無論如何,在您的 UserControl 的 Init 中,您可以顯式地將 Page_PreLoad 方法指定為 UserControl 的 Page 屬性的 PreLoad 事件的處理程序,而不是在方法聲明中使用“Handles”語法。 您的示例正在嘗試將事件處理程序分配給 UserControl object 上的事件,以處理 UserControl object 未引發的事件。 正如您所指出的,UserControl 不繼承自 Page,這是 PreLoad 事件所在的位置。 但是,UserControl 確實包含 Page object 作為其屬性之一,這反過來將 PreLoad 作為您可以為其分配處理程序的事件公開。 無論如何,這會編譯並接近您正在尋找的內容(使用 C 風格的注釋來保留 WMD 語法突出顯示)。

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 進行事件處理程序分配,然后引發 Page 的 OnLoad 事件,然后執行控件內的事件處理程序。

除非您使用 Jason 的選項 go,否則您要么在 INIT 事件(加載 Viewstate 之前)或 PAGE LOAD 事件中執行操作。

我的問題是:有什么理由必須在 PreLoad 而不是 Load 事件中執行該操作?

請記住,Preload 真正做的唯一事情是將 Viewstate 和 PostBack 數據加載到各種控件中(有關生命周期的更多信息)。

LOAD 事件將在任何控制事件(例如按鈕單擊)之前發生,因此您可能會很好地在那里執行您的操作。 唯一的原因是,如果您不希望 PostBack 或 Viewstate 數據干擾您的流程(無論出於何種原因),那么在這種情況下,您可以利用 INIT 事件。

為什么不創建一個方法來執行任何需要完成的預加載,並讓您的頁面調用該方法?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM