Reputation: 187
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
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
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
Reputation: 1
ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder1");
Button img = (Button)cph.FindControl("btncreate_email");
Upvotes: 0
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
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
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
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
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
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