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
に変更されました-コントロールを見つけるにはどうすればよいですか?
コンテンツページのボタンを見つけるには、最初にContentPlaceHolder1
コントロールを検索する必要があります。次に、ContentPlaceHolder1
コントロールのFindControl
関数を使用してボタンを検索します。
ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.FindControl("ContentPlaceHolder1");
Response.Write(((Button)cph.FindControl("a")).Text);
これを試してみてください。
this.Master.FindControl("Content2").FindControl("a");
この記事を参照してください...
http://www.west-wind.com/weblog/posts/2006/Apr/09/ASPNET-20-MasterPages-and-FindControl
検索するページにマスターページがない場合
this.Page.Master.FindControl("ContentPlaceHolder1");
else
this.Page.Master.FindControl("ContentPlaceHolder1").FindControl("controlAFromPage");
これはおそらく、ASP.NETがネストされたコントロールのクライアントIDに名前を付ける方法が原因です。ページのソースを見て、コントロールに名前を付けているASP.NETを正確に確認します。
たとえば、私のページを見ると、コンテンツプレースホルダー内のボタンが次のように表示されていることがわかります。
<input type="submit" name="ctl00$ContentPlaceHolder1$btn1" value="hello" id="MainContent_btn1" />
この場合、FindControl( "ctl00 $ ContentPlaceHolder1 $ btn1")はボタンへの参照を返します。
ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder1");
Button img = (Button)cph.FindControl("btncreate_email");
コントロールはネストされています。あなたはあなたのページを持っています、ページの中にもっとコントロールがあります、これらのコントロールのいくつかはコントロール自体を含んでいます。 FindControlメソッドは、現在の名前付けコンテナーのみを検索するか、Page.FindControlsを実行する場合は、ページ内のコントロールのみを検索し、コントロール内のコントロールでは検索しないため、再帰的に検索する必要があります。
ボタンがコンテンツプレースホルダー内にあり、その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を渡します
これでページ上のすべてのコントロールが見つかります
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";
他のページのマスターページコントロールを見つけるには、次のようにします。
Button btnphotograph = (Button)this.Master.FindControl("btnphotograph");
btnphotograph.Text="Hello!!";