【问题标题】:find control in page在页面中查找控件
【发布时间】:2012-03-22 20:43:33
【问题描述】:

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 - 怎么找控制?

【问题讨论】:

  • clientID和id不一样,在这个例子中clientidmode不会改变任何东西

标签: c# asp.net master-pages


【解决方案1】:

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

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

【讨论】:

  • 这段代码是放在母版后面的代码中还是你试图定位控件的页面中。我认为您的意思是大师,但只是为了澄清。
  • @Chef_Code:是的。大师。
  • 但是如果你在一个控件而不是页面中,你可以使用下面的代码:this.Page.Master.FindControl("ContentPlaceHolder1");
【解决方案2】:

你可以试试这个..

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

你可以参考这篇文章...

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

【讨论】:

    【解决方案3】:

    这可能是由于 ASP.NET 为嵌套控件命名客户端 ID 的方式。查看页面源代码并准确了解 ASP.NET 为您的控件命名的内容。

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

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

    在这种情况下 FindControl("ctl00$ContentPlaceHolder1$btn1") 返回对 Button 的引用。

    【讨论】:

    • 扩展他的最后一条评论,在您的网络浏览器上使用 View Source 查看 ASP.NET 生成的全名(可能很长)。
    • 'a' 改成 'ctl00_ContentPlaceHolder1_a' 现在怎么能找到控件?
    • FindControl("ctl00$ContentPlaceHolder1$a")
    • 虽然如果他在客户端使用 jQuery 或 JS 这会起作用,但这不是在后面的代码中找到控件的正确技术。您需要先找到 content1 控件,然后按照下面的一些答案中所述找到它下面的控件。
    【解决方案4】:

    如果要查找的页面没有母版页

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

    其他

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

    【讨论】:

      【解决方案5】:

      控件是嵌套的。你有你的页面,页面里面有更多的控件,其中一些控件本身包含控件。 FindControl 方法仅搜索当前命名容器,或者如果您执行 Page.FindControls if 只会在 Page 中查找控件,而不是在这些控件内的 Controls 中,因此您必须递归搜索。

      如果您知道按钮在内容占位符内并且您知道它的 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

      【讨论】:

        【解决方案6】:
        ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder1");
               Button img = (Button)cph.FindControl("btncreate_email");
        

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            这应该会在页面上找到任何控件

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

              • 'a' 改成 'ctl00_ContentPlaceHolder1_a' 现在怎么能找到控件?
              • 好吧,您可以将 ctl00_ContentPlaceHolder1_a 作为它可能会找到的名称。或者将按钮更改为 clientidmode = static ,然后查看 id 是什么。它应该保持“a”。
              猜你喜欢
              • 1970-01-01
              • 2013-05-09
              • 1970-01-01
              • 1970-01-01
              • 2010-10-24
              • 2016-06-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多