user1263390
user1263390

Reputation: 187

find control in page

HTML

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

Code

protected  void a_Click(object sender,EventArgs e)
{
    Response.Write(((Button)FindControl("a")).Text);

}

This code works fine.

However, this code:

HTML

 <%@ 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> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <asp:Button runat="server" ID="a" OnClick="a_Click" Text="andj"/>
</asp:Content>

Code

protected void a_Click(object sender, EventArgs e)
{
    Response.Write(((Button)FindControl("a")).Text);
}

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?

Upvotes: 10

Views: 77651

Answers (9)

eugeniy
eugeniy

Reputation: 11

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";

Upvotes: 0

Joydip Roy
Joydip Roy

Reputation: 1

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

Button btnphotograph = (Button)this.Master.FindControl("btnphotograph");
btnphotograph.Text="Hello!!";

Upvotes: 0

Joydip Roy
Joydip Roy

Reputation: 1

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

Upvotes: 0

john carlo
john carlo

Reputation: 21

if the page to look for has no master page

this.Page.Master.FindControl("ContentPlaceHolder1");

else

this.Page.Master.FindControl("ContentPlaceHolder1").FindControl("controlAFromPage");

Upvotes: 1

e wagness
e wagness

Reputation: 301

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");
Response.Write(((Button)cph.FindControl("a")).Text);

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")
      {
         Response.Write(((Button)c).Text);
         return null;
      }
      if(c.HasControls())
      {
         DisplayButtonText(c.Controls);
      }
}

initially you would pass this Page.Controls

Upvotes: 0

Chen G
Chen G

Reputation: 41

You may try this..

this.Master.FindControl("Content2").FindControl("a");

You may refer this article...

http://www.west-wind.com/weblog/posts/2006/Apr/09/ASPNET-20-MasterPages-and-FindControl

Upvotes: 4

Hans
Hans

Reputation: 13030

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");
 Response.Write(((Button)cph.FindControl("a")).Text);

Upvotes: 34

McGarnagle
McGarnagle

Reputation: 102723

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.

Upvotes: 3

Adam
Adam

Reputation: 3665

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.

Upvotes: -3

Related Questions