2012-03-22 12 views
10

hallazgo en la página HTML

<body> 
    <form id="form1" runat="server">  
     <asp:Button runat="server" ID="a" OnClick="a_Click" Text="apd"/>  
    </form> 
</body> 

Código

protected void a_Click(object sender,EventArgs e) 
{ 
    Response.Write(((Button)FindControl("a")).Text); 

} 

Este código funciona bien.

Sin embargo, este código:

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> 

Código

protected void a_Click(object sender, EventArgs e) 
{ 
    Response.Write(((Button)FindControl("a")).Text); 
} 

Este código no funciona y vuelve FindControlNull - ¿por qué es esto?

El método FindControl funciona bien en una página simple, pero en una página maestra, ¿no funciona?

El ID del a se ha cambiado a ctl00_ContentPlaceHolder1_a - ¿cómo se puede encontrar el control?

+2

El ClientId y el ID no es el mismo, y ClientIDMode no va a cambiar nada en este ejemplo – f2lollpll

Respuesta

28

Para encontrar el botón en su página de contenido primero debe buscar el control ContentPlaceHolder1. A continuación, utilice la función FindControl en el control ContentPlaceHolder1 para buscar un botón:

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

Este código se coloca en el código detrás del maestro o la página en la que intenta ubicar los controles. Creo que te refieres al maestro, pero solo por aclaración. –

+0

@Chef_Code: Sí. El maestro. – Hans

0

Esto probablemente se deba a la forma en que ASP.NET nombra los ID de cliente para los controles anidados. Mire la fuente de la página y vea exactamente lo que ASP.NET le está dando a su control.

Por ejemplo, mirando mi página puedo ver que el botón dentro del marcador de contenido hace así:

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

En este caso FindControl ("ctl00 $ ContentPlaceHolder1 $ btn1") devuelve una referencia a la Botón.

+0

Para ampliar su último comentario, usando Ver código fuente de su navegador web para ver el pleno nombre que genera ASP.NET (puede ser bastante largo). – Guvante

+0

'a' cambiado a 'ctl00_ContentPlaceHolder1_a' ahora, ¿cómo se puede encontrar el control? – user1263390

+0

FindControl ("ctl00 $ ContentPlaceHolder1 $ a") – McGarnagle

-3

Ver si el ID del control se está representando como 'a'. Use firebug o herramientas de desarrollador mientras la página se está cargando. Puede cambiar el modo de id del cliente a estático y obtener la misma ID cada vez.

+0

'a' cambiado a 'ctl00_ContentPlaceHolder1_a' ahora, ¿cómo se puede encontrar el control? – user1263390

+0

Bueno, puedes poner ese ctl00_ContentPlaceHolder1_a como el nombre que probablemente encontraría. O cambie el botón a clientidmode = static y vea cuál es el id entonces. Debería quedarse 'a'. – Adam

0

controles están anidados. tiene su página, dentro de la página hay más controles, algunos de estos controles contienen controles. el método FindControl solo busca en el contenedor de nombres actual, o si lo hace, Page.FindControls solo buscará los controles en la Página, no en los Controles dentro de esos controles, por lo que debe buscar recursivamente.

si se conoce el botón se encuentra en el interior del marcador de posición de contenido y se conoce su identificación que puede hacer:

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

alternativamente, si sus controles está profundamente anidados, puede crear una función recursiva para buscarlo :

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

inicialmente que pasan esta Page.Controls

1

si la página para buscar no tiene ninguna página maestra

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

demás

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

Por favor explique su código. – hgwhittle

0

Esto debería encontrar ningún control en la página

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

llamada como:

Button btn = (Button)FindALL(this.Page.Controls, "a"); 
btn.Text = "whatever"; 
0

Para encontrar el control de la página principal en el otro páginas podemos utilizar esto:

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