Найти элемент управления на странице

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 изменен на ctl00_ContentPlaceHolder1_a - как можно найти элемент управления?

Ответ 1

Чтобы найти кнопку на своей странице контента, вам нужно сначала найти элемент управления ContentPlaceHolder1. Затем используйте функцию FindControl в элементе управления ContentPlaceHolder1 для поиска вашей кнопки:

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

Ответ 3

если страница для поиска не имеет главной страницы

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

еще

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

Ответ 4

Вероятно, это связано с тем, как ASP.NET называет идентификаторы клиентов для вложенных элементов управления. Посмотрите на источник страницы и посмотрите, как именно ASP.NET называет ваш контроль.

Например, глядя на мою страницу, я вижу, что кнопка внутри заполнителя содержимого выглядит следующим образом:

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

В этом случае FindControl ( "ctl00 $ContentPlaceHolder1 $btn1" ) возвращает ссылку на кнопку.

Ответ 5

Элементы управления

являются вложенными. у вас есть страница, внутри страницы есть больше элементов управления, некоторые из этих элементов управления содержат элементы управления. метод FindControl ищет только текущий контейнер именования, или если вы выполняете функцию Page.FindControls, если будете искать элементы управления только на странице, а не в элементах управления внутри этих элементов управления, чтобы вы могли искать рекурсивно.

если вы знаете, что кнопка находится внутри держателя содержимого, и вы знаете свой идентификатор, который вы можете сделать:

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

Это должно найти любой элемент управления на странице

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

Ответ 8

Чтобы найти элемент управления главной страницы на других страницах, мы можем использовать это:

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

Ответ 9

Посмотрите, действительно ли идентификатор элемента управления отображается как "a". Используйте firebug или инструменты разработчика во время загрузки страницы. Вы можете изменить режим идентификатора клиента на статический и каждый раз получать одинаковый идентификатор.