How to access controls inside a nested master page? why does it behave differently from content pages?

10,438

Solution 1

I read few things here: http://www.odetocode.com/Articles/450.aspx and found out that the nested page in the middle never calls Page_Load! instead, it fires a load event that you can catch to set whatever fields, so the answer was in: on nested page do the following:

protected override void OnLoad(EventArgs e)
    {
        myTextBox.Text = "anything";
        base.OnLoad(e);
    }

Solution 2

ContentPlaceHolder cp = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder1");
  //base content place holder id

Label objLabel3 = (Label)cp.FindControl("lblNested");
  //lblNested is id in nested master page

Solution 3

This should work without any problems, so something else must be wrong. I just tried it inside a simple test project and I have no problems finding a control on the master page in both cases.

I would check (again) if you refer to the correct master page inside your nested master page. What you could also check is the runtime type of the Master property inside your nested master page. It should be the type of your master page.

EDIT: I thought the issue was about finding a control in the root master page from a nested master page and this should work without any problems. For finding a control inside a content placeholder in a nested master page, take a look at the following forum post.

Share:
10,438
Ayyash
Author by

Ayyash

Don't blame me, sit straight up to see the photo right!

Updated on June 20, 2022

Comments

  • Ayyash
    Ayyash almost 2 years

    Is there a difference between these two scenarios:

    (1) Accessing a property on a master page from a regular child

    (2) Accessing a property on a master page from a nested master page

    I tried to access a textbox in the master page from a content page like this:

    TextBox a;
    a = (TextBox)Master.FindControl("ayyash"); // Master is declared in MasterType directive
    defaultTextbox.Text = a.Text; // defaultTextBox is a textbox control inside default.aspx
    

    it works, but then when I applied the same method on a nested master page:

    TextBox a;
    a = (TextBox)Master.FindControl("ayyash"); // Master is declared in MasterType directive
    myTextBox.Text = a.Text; // myTextBox is a textbox control inside child.master
    

    this does not work, am I missing something? I call both codes inside regulare page_load handler...

    I also noticed I cannot set textbox value inside the nested master page from code behind, there is definitely something im missing, what is it? To shed light on this issue, here is an example:

    Nested Master Page:

    <%@ Master Language="C#" MasterPageFile="MasterPage.master" AutoEventWireup="false" CodeFile="MasterPage2.master.cs" Inherits="MasterPage2" %>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    
    <asp:textbox id="tx2" runat="server" text="this is two"></asp:textbox>
    <asp:contentplaceholder id="newstuff" runat="server"></asp:contentplaceholder>
    </asp:Content>
    

    Code behind:

    Response.Wrote(tx2.Text);
    

    I get NOTHING, why what did I miss? note that I also tried the recursive find control:

    String str = ((TextBox)((Content)FindControl("Content2")).FindControl("tx2")).Text;
    

    still nothing

  • Ayyash
    Ayyash almost 15 years
    i just created a new project from scratch, i still get the same results! i can't access anything on the middle nested page
  • Ronald Wildenberg
    Ronald Wildenberg almost 15 years
    I thought your question was about accessing properties on the root master page from both a nested master page and a content page. I´ll try and see if I can get the otrher snenario to work: accessing a property on a nested master page from a content page.