2012-03-22 15 views
10

HTMLTrova nella pagina

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

Codice

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

} 

Questo codice funziona bene.

Tuttavia, questo codice:

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> 

Codice

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

Questo codice non funziona e FindControl ritorna Null - perché è questo?

Il metodo FindControl funziona in una pagina semplice, ma in una pagina principale, non funziona?

L'ID di a è stato modificato in ctl00_ContentPlaceHolder1_a - come è possibile trovare il controllo?

+2

L'IDcliente e l'id non è la stessa, e ClientIDMode non cambierà nulla in questo esempio – f2lollpll

risposta

28

Per trovare il pulsante nella pagina dei contenuti, è necessario innanzitutto cercare il controllo ContentPlaceHolder1. quindi utilizzare la funzione FindControl sul controllo ContentPlaceHolder1 per cercare il tuo pulsante:

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

Questo codice è inserito nel codice dietro il master o nella pagina in cui stai cercando di localizzare i controlli. Penso che tu intenda il maestro ma solo per un chiarimento. –

+0

@Chef_Code: Sì. Il capo. – Hans

0

Ciò è probabilmente dovuto al modo in cui ASP.NET assegna agli ID client i controlli nidificati. Guarda l'origine della pagina e vedi esattamente cosa ASP.NET sta nominando come tuo controllo.

Per esempio, guardando la mia pagina posso vedere che il pulsante all'interno del segnaposto di contenuto rende in questo modo:

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

In questo caso FindControl ("ctl00 $ ContentPlaceHolder1 $ btn1") restituisce un riferimento al Pulsante.

+0

Per espandere il suo ultimo commento, utilizzando View Source sul tuo browser per vedere il pieno nome che genera ASP.NET (può essere piuttosto lungo). – Guvante

+0

'a' cambiato in 'ctl00_ContentPlaceHolder1_a' ora come può trovare il controllo? – user1263390

+0

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

-3

Verificare se l'ID del controllo viene effettivamente visualizzato come "a". Usa gli strumenti Firebug o sviluppatore mentre la pagina si sta caricando. È possibile modificare la modalità ID client in static e ottenere lo stesso ID ogni volta.

+0

'a' cambiato in 'ctl00_ContentPlaceHolder1_a' ora come può trovare il controllo? – user1263390

+0

Bene, puoi mettere quel ctl00_ContentPlaceHolder1_a come il nome che probabilmente lo troverà. O cambia il pulsante in clientidmode = statico e vedi cosa è l'id allora. Dovrebbe semplicemente rimanere 'a'. – Adam

0

i controlli sono nidificati. hai la tua pagina, all'interno della pagina ci sono più controlli, alcuni di questi controlli contengono i controlli stessi. il metodo FindControl esegue la ricerca solo nel contenitore di denominazione corrente, oppure se si utilizza Page.FindControls se si cercano solo i controlli nella pagina, non nei controlli all'interno di tali controlli, quindi è necessario eseguire la ricerca in modo ricorsivo.

se si conosce il pulsante è all'interno del luogo titolare contenuti e si conosce il suo id si può fare:

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

In alternativa, se i controlli è profondamente nidificate, è possibile creare una funzione ricorsiva per cercarlo :

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

inizialmente si sarebbe passare questo Page.Controls

1

se la pagina per cercare non ha alcuna pagina master

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

altro

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

Spiega il tuo codice. – hgwhittle

0

Questo dovrebbe trovare alcun controllo a pagina

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

chiamata come:

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

Per trovare il controllo pagina master dall'altra pagine possiamo usare questa:

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