Solved

How to raise masterpage event from dynamic usercontrol?

Posted on 2010-08-23
8
897 Views
Last Modified: 2013-11-07
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:
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

Open in new window


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

Open in new window


What's the correct way to call the public method from this dynamically loaded usercontrol? Thanks in advance.
0
Comment
Question by:ZekeLA
  • 4
  • 2
  • 2
8 Comments
 
LVL 35

Expert Comment

by:YZlat
ID: 33503783
0
 
LVL 1

Author Comment

by:ZekeLA
ID: 33503965
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.
0
 
LVL 35

Accepted Solution

by:
YZlat earned 250 total points
ID: 33504248
this part should be helpful in assigning event to your control:

MasterPageFile = "your masterPage";

Control c = (Control)Master.FindControl("Control Id")

c.Event = New EventHandlet(EventsName);

0
 
LVL 16

Assisted Solution

by:kris_per
kris_per earned 250 total points
ID: 33504511

Check out this link => http://msdn.microsoft.com/en-us/library/c8y19k6h.aspx

To see the method of a master page in the content page, you have  to 'strong-type' the master page in content page as following:

<%@ Page  .....
<%@ MasterType  virtualPath="~/MasterPage.master"%>  <= add this line after the Page directive at the top...

now in the cs file of the content page, you can do like:

protected void Page_Load(object sender, EventArgs e)
{
    CompanyName.Text = Master.CompanyName; // CompanyName is a property in master page
}

OR in a button click method
{
    Master.RaiseLogin();
}
0
Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 1

Author Comment

by:ZekeLA
ID: 33504761
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/MyMaster.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.
0
 
LVL 1

Author Comment

by:ZekeLA
ID: 33504821
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?
0
 
LVL 16

Expert Comment

by:kris_per
ID: 33505254

@ 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

Open in new window

0
 
LVL 1

Author Comment

by:ZekeLA
ID: 33536797
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.


    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

Open in new window

0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

In my previous article (http://www.experts-exchange.com/Programming/Languages/.NET/.NET_Framework_3.x/A_4362-Serialization-in-NET-1.html) we saw the basics of serialization and how types/objects can be serialized to Binary format. In this blog we wi…
User art_snob (http://www.experts-exchange.com/M_6114203.html) encountered strange behavior of Android Web browser on his Mobile Web site. It took a while to find the true cause. It happens so, that the Android Web browser (at least up to OS ver. 2.…
Access reports are powerful and flexible. Learn how to create a query and then a grouped report using the wizard. Modify the report design after the wizard is done to make it look better. There will be another video to explain how to put the final p…
Here's a very brief overview of the methods PRTG Network Monitor (https://www.paessler.com/prtg) offers for monitoring bandwidth, to help you decide which methods you´d like to investigate in more detail.  The methods are covered in more detail in o…

746 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now