2010-11-04 58 views
8

嘗試從我的用戶控件的父頁面訪問屬性。訪問來自用戶控件的父頁面屬性

這裏是我的Default.asp代碼隱藏的開始:

Partial Class _Default 
    Inherits System.Web.UI.Page 

    Private _selectedID As String = "74251BK3232" 

    Public Property SelectedID() As String 
      Get 
       Return _selectedID 
      End Get 
      Set(ByVal value As String) 
       _selectedID = value 
      End Set 
    End Property 

這裏是我的用戶控件的代碼隱藏的開始:

Partial Class ctrlAddAttribute 
    Inherits System.Web.UI.UserControl 
    Dim selectedID As String = Me.Parent.Page.selectedID() 

我得到錯誤「selectedID不是成員System.Web.UI.Page「

請adivse!

回答

9

當您將頁面轉換爲名爲_Default的實際實現時,您可以訪問該屬性。

Dim selectedID As String = DirectCast(Me.Page,_Default).selectedID() 

但這不是Usercontrol(可重用性)的目的。 通常情況下,您可以將Controller(頁面)中的ID發送給UserControl。

因此,在UserControl中定義一個屬性並在頁面中設置它。 這樣用戶控件仍然可以在其他頁面中工作。

+1

感謝蒂姆,我把你的建議。我添加了一個公共屬性到我的控件中,並在我動態添加它時從頁面中設置了該屬性! – s15199d 2010-11-04 15:06:08

1

因爲用戶控件不屬於該頁面,所以不能直接訪問它,除非您直接在包含頁面的usercontrol中設置一個屬性,或者創建一個循環遍歷所有父對象的遞歸函數直到找到System.Web.UI.Page類型的對象。

對於第一個,你可以使用屬性在用戶控件(我使用了一個名爲ParentForm物業這樣做):

Private _parentForm as System.Web.UI.Page 
Public Property ParentForm() As System.Web.UI.Page ' or the type of your page baseclass 
    Get 
     Return _parentForm 
    End Get 
    Set 
     _parentForm = value 
    End Set 
End Property 

在「父母」頁面,你會設置該屬性的儘可能早的事件。我更喜歡使用PreLoad,因爲它在加載之前(因此在大多數其他控件需要它時可用)和init之後。

Protected Sub Page_PreLoad(ByVal sender as Object, ByVal e as EventArgs) Handles Me.PreLoad 
    Me.myUserControlID.ParentForm = Me 
End Sub 

你也可以編寫一個函數通過父控件來控制尋找頁面。以下代碼未經測試,因此可能需要調整,但這個想法很有道理。

Public Shared Function FindParentPage(ByRef ctrl As Object) As Page 
    If "System.Web.UI.Page".Equals(ctrl.GetType().FullName, StringComparison.OrdinalIgnoreCase) Then 
     Return ctrl 
    Else 
     Return FindParentPage(ctrl.Parent) 
    End If 
End Function 

編輯:您還因爲它沒有類型System.Web.UI.Page中存在不能直接訪問該屬性。正如@Tim Schmelter建議的那樣,您可以嘗試將頁面轉換爲特定的頁面類型_Default,或者如果這對於許多頁面來說都是常見的,則可能需要創建基本頁面類並將該屬性包含在該類中。然後,你可以在頁面繼承這個類而不是System.Web.UI.Page

Public Class MyBasePage 
    Inherits System.Web.UI.Page 

    Public Property SelectedID() as Integer 
     ... 
    End Property 
End Class 

然後:

Partial Class _Default 
    Inherits MyBasePage 

    ... 

End Class 
相關問題