HTML
<body>
<form id="form1" runat="server">
<asp:Button runat="server" ID="a" OnClick="a_Click" Text="apd"/>
</form>
</body>
代码
protected void a_Click(object sender,EventArgs e)
{
Response.Write(((Button)FindControl("a")).Text);
}
此代码工作正常。
但是,这段代码:
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>
代码
protected void a_Click(object sender, EventArgs e)
{
Response.Write(((Button)FindControl("a")).Text);
}
此代码不起作用且FindControl
返回Null
- 为什么会这样?
FindControl
方法适用于一个简单的页面,但在母版页中,它不起作用吗?
a
的ID更改为ctl00_ContentPlaceHolder1_a
- 如何找到控件?
答案 0 :(得分:31)
要在内容页面上找到该按钮,您必须先搜索ContentPlaceHolder1
控件。
然后使用FindControl
控件上的ContentPlaceHolder1
功能搜索您的按钮:
ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.FindControl("ContentPlaceHolder1");
Response.Write(((Button)cph.FindControl("a")).Text);
答案 1 :(得分:4)
你可以试试这个..
this.Master.FindControl("Content2").FindControl("a");
你可以参考这篇文章......
http://www.west-wind.com/weblog/posts/2006/Apr/09/ASPNET-20-MasterPages-and-FindControl
答案 2 :(得分:1)
如果要查找的页面没有母版页
this.Page.Master.FindControl("ContentPlaceHolder1");
否则
this.Page.Master.FindControl("ContentPlaceHolder1").FindControl("controlAFromPage");
答案 3 :(得分:0)
这可能是由于ASP.NET如何命名嵌套控件的客户端ID。查看页面源代码,确切了解ASP.NET命名控件的内容。
例如,查看我的页面,我可以看到内容占位符中的按钮呈现如下:
<input type="submit" name="ctl00$ContentPlaceHolder1$btn1" value="hello" id="MainContent_btn1" />
在这种情况下,FindControl(“ctl00 $ ContentPlaceHolder1 $ btn1”)返回对Button的引用。
答案 4 :(得分:0)
控件是嵌套的。你有你的页面,在页面内有更多的控件,其中一些控件包含控件本身。 FindControl方法只搜索当前的命名容器,或者如果你执行Page.FindControls,如果只查找Page中的控件,而不是那些控件中的控件,那么你必须递归搜索。
如果您知道按钮位于内容占位符内,并且您知道其ID,则可以执行以下操作:
ContentPlaceHolder cph = Page.FindControl("ContentPlaceHolder1");
Response.Write(((Button)cph.FindControl("a")).Text);
或者,如果你的控件是深层嵌套的,你可以创建一个递归函数来搜索它:
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);
}
}
最初你会传递这个Page.Controls
答案 5 :(得分:0)
ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder1");
Button img = (Button)cph.FindControl("btncreate_email");
答案 6 :(得分:0)
这应该在页面上找到任何控件
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;
}
请致电:
Button btn = (Button)FindALL(this.Page.Controls, "a");
btn.Text = "whatever";
答案 7 :(得分:0)
要在其他页面上找到母版页控件,我们可以使用它:
Button btnphotograph = (Button)this.Master.FindControl("btnphotograph");
btnphotograph.Text="Hello!!";
答案 8 :(得分:-3)
查看控件的ID实际上是否呈现为“a”。在加载页面时使用firebug或开发人员工具。您可以将客户端ID模式更改为静态,并且每次都获得相同的ID。