web-dev-qa-db-ja.com

ページ内のコントロールを見つける

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);
}

このコードは機能せず、FindControlNullを返します-これはなぜですか?

FindControlメソッドは単純なページでは問題なく機能しますが、マスターページでは機能しませんか?

aのIDがctl00_ContentPlaceHolder1_aに変更されました-コントロールを見つけるにはどうすればよいですか?

10
user1263390

コンテンツページのボタンを見つけるには、最初にContentPlaceHolder1コントロールを検索する必要があります。次に、ContentPlaceHolder1コントロールのFindControl関数を使用してボタンを検索します。

 ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.FindControl("ContentPlaceHolder1");
 Response.Write(((Button)cph.FindControl("a")).Text);
31
Hans

これを試してみてください。

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

この記事を参照してください...

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

4
Chen G

検索するページにマスターページがない場合

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

else

this.Page.Master.FindControl("ContentPlaceHolder1").FindControl("controlAFromPage");
1
john carlo

これはおそらく、ASP.NETがネストされたコントロールのクライアントIDに名前を付ける方法が原因です。ページのソースを見て、コントロールに名前を付けているASP.NETを正確に確認します。

たとえば、私のページを見ると、コンテンツプレースホルダー内のボタンが次のように表示されていることがわかります。

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

この場合、FindControl( "ctl00 $ ContentPlaceHolder1 $ btn1")はボタンへの参照を返します。

0
McGarnagle
ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder1");
       Button img = (Button)cph.FindControl("btncreate_email");
0
Joydip Roy

コントロールはネストされています。あなたはあなたのページを持っています、ページの中にもっとコントロールがあります、これらのコントロールのいくつかはコントロール自体を含んでいます。 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を渡します

0
e wagness

これでページ上のすべてのコントロールが見つかります

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

他のページのマスターページコントロールを見つけるには、次のようにします。

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