find control in page


    <form id="form1" runat="server">    
       <asp:Button runat="server" ID="a" OnClick="a_Click" Text="apd"/>    

protected  void a_Click(object sender,EventArgs e)


This code works fine.

However, this code:


 <%@ Page Title="" Language="C#" MasterPageFile="~/Student/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Student_Default" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <asp:Button runat="server" ID="a" OnClick="a_Click" Text="andj"/>

protected void a_Click(object sender, EventArgs e)

This code does not work and FindControl returns Null – why is this?

The FindControl method works in a simple page fine, but in a master page, does it not work?

The ID of the a is changed to ctl00_ContentPlaceHolder1_a – how can find control?


Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

To find the button on your content page you have to search for the ContentPlaceHolder1 control first.
Then use the FindControl function on the ContentPlaceHolder1 control to search for your button:

 ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.FindControl("ContentPlaceHolder1");

Method 2

You may try this..


You may refer this article…

Method 3

This is probably due to how ASP.NET names the client IDs for nested controls. Look at the page source and see exactly what ASP.NET is naming your control.

For example, looking at my page I can see that the button within the content placeholder renders like this:

<input type="submit" name="ctl00$ContentPlaceHolder1$btn1" value="hello" id="MainContent_btn1" />

In this case FindControl(“ctl00$ContentPlaceHolder1$btn1”) returns a reference to the Button.

Method 4

if the page to look for has no master page



Method 5

controls are nested. you have your page, inside the page there is more controls, some of these controls contain controls themselves. the FindControl method only searches the current naming container, or if you do Page.FindControls if will only look for the controls in Page, not in the Controls inside those controls so you must search recursively.

if you know the button is inside the content place holder and you know its id you can do:

ContentPlaceHolder cph = Page.FindControl("ContentPlaceHolder1");

alternatively, if your controls is deeply nested, you can create a recursive function to search for it:
private void DisplayButtonText(ControlCollection page)
   foreach (Control c in page)
      if(((Button)c).ID == "a")
         return null;

initially you would pass this Page.Controls

Method 6

ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder1");
       Button img = (Button)cph.FindControl("btncreate_email");

Method 7

To find the master page control on the other pages we can use this:

Button btnphotograph = (Button)this.Master.FindControl("btnphotograph");

Method 8

This should find any Control on page

private Control FindALL(ControlCollection page, string id)
  foreach (Control c in page)
    if (c.ID == id)
      return c;

    if (c.HasControls())
      var res = FindALL(c.Controls, id);

      if (res != null)
        return res;
  return null;

Call like:
Button btn = (Button)FindALL(this.Page.Controls, "a");
btn.Text = "whatever";

Method 9

See if the ID of the control is in fact being rendered as ‘a’. Use firebug or developer tools while page is loading. You can change client id mode to static and get the same ID each time.

All methods was sourced from or, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Notify of

Inline Feedbacks
View all comments
Would love your thoughts, please comment.x