在页面中查找控件

10

超文本标记语言

<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,如何查找控件?


2
客户端ID和ID不同,在此示例中clientidmode不会改变任何内容。 - f2lollpll
9个回答

34

要在您的内容页面上查找按钮,您必须首先搜索ContentPlaceHolder1控件。 然后使用ContentPlaceHolder1控件上的FindControl函数搜索您的按钮:

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

这段代码是放在主控件的代码后端还是你要定位控件的页面上?我想你是指主控件,但为了澄清一下。 - Chef_Code
@Chef_Code:是的,大师。 - Hans
然而,如果您在控件中而不是页面中,则可以使用以下代码:this.Page.Master.FindControl("ContentPlaceHolder1"); - Damian Vogel

4

3

这可能是由于ASP.NET对嵌套控件的客户端ID命名方式。查看页面源代码,找出ASP.NET为您的控件命名的确切方法。

例如,查看我的页面,我可以看到内容占位符中的按钮呈现如下:

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

在这种情况下,FindControl("ctl00$ContentPlaceHolder1$btn1") 返回一个对按钮的引用。

为了详细说明他最后的评论,可以在你的网页浏览器上使用“查看源代码”来查看 ASP.NET 生成的完整名称(可能会很长)。 - Guvante
现在'a'已更改为'ctl00_ContentPlaceHolder1_a',如何找到控件? - user1263390
找到控件("ctl00$ContentPlaceHolder1$a") - McGarnagle
2
虽然如果他在客户端使用jQuery或JS,这将起作用,但这不是在代码后台中查找控件的正确技术。您需要先找到content1控件,然后像下面某些答案中所述,再找到其下面的控件。 - mellodev

1
如果要查找的页面没有母版页。
this.Page.Master.FindControl("ContentPlaceHolder1");

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

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


0

要在其他页面上找到母版页控件,我们可以使用以下代码:

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

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

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

-3

查看控件的ID是否实际上被渲染为'a'。在页面加载时使用Firebug或开发者工具。您可以将客户端ID模式更改为静态,并每次获取相同的ID。


现在'a'已更改为'ctl00_ContentPlaceHolder1_a',如何找到控件? - user1263390
你可以将ctl00_ContentPlaceHolder1_a作为名称放置,它可能会找到它。或者将按钮更改为clientidmode = static,然后查看ID是什么。它应该保持为“a”。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接