ZekeLA
asked on
How to raise masterpage event from dynamic usercontrol?
I have a masterpage that dynamically loads a usercontrol. The masterpage has a public method that raises a public event. I want the usercontrol to call that method to raise the event so the web page can respond to it. Unfortunately, I can't get my usercontrol to recognize the masterpage method. It says my method is not a member of System.Web.UI.MasterPage.
Here's my masterpage code:
Here's my usercontrol code:
What's the correct way to call the public method from this dynamically loaded usercontrol? Thanks in advance.
Here's my masterpage code:
Partial Class Master_Mobile
Inherits System.Web.UI.MasterPage
Public Event Login()
Public Sub RaiseLogin()
RaiseEvent Login()
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
' Create Dynamic Controls
If ShowLogin And Me.MasterLogin.Controls().Count = 0 Then
Dim ucLogin As UserControl = LoadControl("~/UserControls/Login.ascx")
Me.MasterLogin.Controls.Add(ucLogin)
End If
End Sub
Here's my usercontrol code:
Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSubmit.Click
Call Page.Validate()
If Page.IsValid Then
' Return to caller
Call Page.Master.RaiseLogin() ' THIS LINE FAILS
End If
End Sub
What's the correct way to call the public method from this dynamically loaded usercontrol? Thanks in advance.
http://forums.asp.net/p/1331400/2674329.aspx
ASKER
I don't have nested master pages and that link shows how to find a control from a page which is not what I have. Please explain how that applies to my situation.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
kris, I can't strongly type it that way because it's a usercontrol. <%@ MasterType virtualPath="~/MasterPage. master"%> doesn't work for the Control directive. I tried <%@ Reference Control="~/Layouts/MyMaste r.master"% > but that still doesn't expose the my master page class. When I use the object browser I can't find my master page class in my project's namespace.
ASKER
Yzlat, I don't understand your suggestion. I don't need to assign the masterpage. it is the usercontrol that can't find the master page's method. Not the page. It makes no sense to search for the control from within the control. Can you be more specific and / or reference the original code I posted?
@ MasterType directive can be added only in content page file. i think it is not for controls....below is some code with delegates/events for your code..see if this helps....
In User control class file:
Delegate Function LoginEvent() As String
Public Dim LoginEventHandler As LoginEvent
Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSubmit.Click
Call Page.Validate()
If Page.IsValid Then
' Return to caller
' Call Page.Master.RaiseLogin() ' THIS LINE FAILS
LoginEventHandler ( ) ' CALL DELEGATE function
End If
End Sub
in masterpage code :
Partial Class Master_Mobile
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
' Create Dynamic Controls
If ShowLogin And Me.MasterLogin.Controls().Count = 0 Then
Dim ucLogin As UserControl = LoadControl("~/UserControls/Login.ascx")
ucLogin.LoginEventHandler = New LoginEvent(AddressOf Login) ' ADD THIS LINE - TO PASS Login function as delegate
Me.MasterLogin.Controls.Add(ucLogin)
End If
End Sub
Public Function Login() As String
' this is the function that will get called when submit button is clicked in user control
End Sub
ASKER
I finally figured out my problem. I didn't include the usercontrol reference on my master page. Once I added
<%@ Register TagPrefix="uc1" TagName="Login" Src="~/UserControls/Login. ascx" %>
I was able to change my master page code as shown below. Thanks to both for your guidance and suggestions.
<%@ Register TagPrefix="uc1" TagName="Login" Src="~/UserControls/Login.
I was able to change my master page code as shown below. Thanks to both for your guidance and suggestions.
Public Event MasterLoggedIn(ByVal sender As Object, ByVal e As EventArgs)
Protected Sub ProcessLogin(ByVal sender As Object, ByVal e As System.EventArgs)
RaiseEvent MasterLoggedIn(Me, New EventArgs())
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
' Create Dynamic Controls
If ShowLogin Then
Call AddLogin()
End If
' Content Visibility
Me.MasterContent.Visible = Not ShowLogin
Me.MasterLogin.Visible = ShowLogin
End Sub
Protected Sub AddLogin()
Dim uc As MyNamespace.UCLogin = LoadControl("~/UserControls/Login.ascx")
Me.MasterLogin.Controls.Add(uc)
AddHandler uc.LoggedIn, AddressOf ProcessLogin
End Sub