2010-11-04 17 views
8

Intentar acceder a una propiedad desde la página principal en mi control de usuario.Acceder a la propiedad de la página principal desde el Control de usuario

Aquí está el comienzo de mi código subyacente 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 

Este es el comienzo de mi código subyacente control de usuario:

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

estoy recibiendo el error "SelectedID no es miembro de System.Web.UI.Página "

¡Advierta!

Respuesta

9

Puede acceder a la propiedad cuando transfiere la página a su implementación real llamada _Default.

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

Pero ese no es el propósito de un Usercontrol (reutilización). Normalmente, le daría la ID del Controlador (página) al UserControl.

Defina una propiedad en UserControl y configúrela desde la página. De esta manera, el UserControl aún funcionaría en otras páginas.

+1

Gracias Tim, tomé su consejo. ¡Agregué una propiedad pública a mi control y la configuré desde la página cuando la agregué dinámicamente! – s15199d

1

Como el control de usuario no pertenece a la página, no puede acceder directamente a menos que establezca explícitamente una propiedad en el control de usuario desde la página incluida o cree una función recursiva que recorre todos los objetos principales hasta que encuentre un objeto del tipo System.Web.UI.Page.

Para el primero, se podría utilizar una propiedad (he hecho esto usando una propiedad llamada ParentForm) en el control de usuario:

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 

En la página "padre", se debe establecer esta propiedad en un evento tan temprano como sea posible. Prefiero usar PreLoad porque viene antes de la carga (por lo tanto, está disponible cuando la mayoría de los otros controles lo necesitarían) y después de la inicialización.

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

También puede escribir una función trolls a través de los controles principales para buscar la página. El código siguiente no se ha probado, por lo que puede requerir ajustes, pero la idea es sonido.

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 

EDIT: También no se puede acceder a este inmueble directamente, ya que no existe dentro del tipo System.Web.UI.Page. Como recomienda @Tim Schmelter, puede intentar enviar la página al tipo de página específico _Default o si esto es algo común en muchas de sus páginas, puede que necesite crear una clase de página base e incluir su propiedad en esa clase. A continuación, puede heredar esta clase en lugar de System.Web.UI.Page

Public Class MyBasePage 
    Inherits System.Web.UI.Page 

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

Luego, en la página:

Partial Class _Default 
    Inherits MyBasePage 

    ... 

End Class 
Cuestiones relacionadas