2008-09-24 53 views
0

我正在構建一個應用程序,其中頁面將根據查詢字符串動態地加載用戶控件(x.ascx)。使用web用戶控件更新頁面文本

我在頁面上有一個驗證摘要,並希望從用戶控件更新它。這將允許我使用一個驗證摘要進行多個控件。我如何在控件和頁面之間傳遞數據。

我知道我可以在設計時定義控件,並使用事件來完成,但這些控件是使用Page.LoadControl動態加載的。

此外,我想避免使用會話或查詢字符串。

回答

1

找到這樣做的一種方法:

步驟1:創建一個基本用戶控制並定義委託和事件在該控制。

第2步:在基本用戶控件中創建一個公共函數來引發Step1中定義的事件。

 
'SourceCode for Step 1 and Step 2 
Public Delegate Sub UpdatePageHeaderHandler(ByVal PageHeading As String) 
Public Class CommonUserControl 
    Inherits System.Web.UI.UserControl 

    Public Event UpdatePageHeaderEvent As UpdatePageHeaderHandler 
    Public Sub UpdatePageHeader(ByVal PageHeadinga As String) 
     RaiseEvent UpdatePageHeaderEvent(PageHeadinga) 
    End Sub 
End Class 

第3步:從步驟1中創建的基本用戶控件繼承Web用戶控件。

第4步:從您的Web用戶控件 - 調用您在Step2中定義的MyBase.FunctionName。

 
'SourceCode for Step 3 and Step 4 
Partial Class DerievedUserControl 
    Inherits CommonUserControl 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     MyBase.PageHeader("Test Header") 
    End Sub 
End Class 

第5步:在您的網頁,加載控制動態使用Page.LoadControl和鑄造控制爲基礎的用戶控制。

步驟6:使用此控件附加事件處理程序。

 
'SourceCode for Step 5 and Step 6 
Private Sub LoadDynamicControl() 
    Try 
     'Try to load control 
     Dim c As CommonUserControl = CType(LoadControl("/Common/Controls/Test.ascx", CommonUserControl)) 
     'Attach Event Handlers to the LoadedControl 
     AddHandler c.UpdatePageHeaderEvent, AddressOf PageHeaders 
     DynamicControlPlaceHolder.Controls.Add(c) 
    Catch ex As Exception 
     'Log Error 
    End Try 
End Sub
0

假設你在談論asp的驗證器控件,使它們與驗證總結一起工作應該很容易:使用相同的驗證組。通常,我從基類中派生出所有的用戶控件,該基類添加了一個ValidationGroup屬性,該屬性的setter調用一個將所有內部驗證器更改爲相同驗證組的overriden方法。

棘手的部分是讓它們在動態添加時表現出來。有一些問題應該注意,主要涉及頁面循環以及將它們添加到Page對象時。如果您知道在設計時使用的所有可能的用戶控件,我會嘗試使用EnableViewState和Visible靜態添加它們,以儘量減少開銷,即使它們太多。

相關問題