Trying to access a property from the parent page on my user control.
Here's the start of my default.asp codebehind:
Partial Class _Default
Private _selectedID As String = "74251BK3232"
Public Property SelectedID() As String
Set(ByVal value As String)
_selectedID = value
Here's the start of my user control codebehind:
Partial Class ctrlAddAttribute
Dim selectedID As String = Me.Parent.Page.selectedID()
I'm getting the error "selectedID is not a member of System.Web.UI.Page"
You could access the property when you cast the Page to your actual implementaion called _Default.
Dim selectedID As String = DirectCast(Me.Page,_Default).selectedID()
But that is not the purpose of a Usercontrol(reusability). Normally you would give the ID from the Controller(page) to the UserControl.
So define a property in the UserControl and set it from the page. On this way the UserControl would still work in other pages.
Because the user control doesn't belong to the page, you can't access it directly unless you either explicitly set a property in the usercontrol from the including page or create a recursive function that cycles through all of the parent objects until it finds an object of type
For the first, you could use a property (I've done this using a property called
ParentForm) in the user control:
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
In the "Parent" page, you would set this property in an event as early as possible. I prefer to use PreLoad because it comes before the load (thus is available when most other controls would need it) and after the init.
Protected Sub Page_PreLoad(ByVal sender as Object, ByVal e as EventArgs) Handles Me.PreLoad Me.myUserControlID.ParentForm = Me End Sub
You could also write a function trolls through the parent controls to find the page. Following code is untested so it may require tweaking, but the idea is sound.
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: You also can't access this property directly because it does not exist within the type
System.Web.UI.Page. As @Tim Schmelter recommends, you can either attempt to cast the page to the specific page type
_Default or if this is something common to many of your pages, you may need to create a base page class and include your property in that class. Then you can inherit this class instead of System.Web.UI.Page
Public Class MyBasePage Inherits System.Web.UI.Page Public Property SelectedID() as Integer ... End Property End Class
Then in the page:
Partial Class _Default Inherits MyBasePage ... End Class