2009-10-16 24 views
8

Su un sito, sto solo utilizzando una pagina Master di livello singolo e in una pagina che utilizza quel master, posso farlo.Master.FindControl ("controlName") per accedere al controllo. Funziona bene.Masterpages nested e .FindControl

Tuttavia, utilizzando lo stesso codice su un sito con due livelli di pagina principale. MainMaster e SpecificMaster che ha come master MainMaster.

Quindi nella pagina che utilizza SpecificMaster, FindControl restituisce null per l'oggetto. L'unica differenza che vedo è l'annidamento delle masterpages.

Quando ho impostato il punto di interruzione e guardo la pagina.Master, sta visualizzando SpecificMaster e SpecificMaster sta mostrando MainMaster come il suo master correttamente, ma FindControl sta ancora fallendo.

Quando visualizzo il codice sorgente in IE, il controllo viene chiamato correttamente, senza .NET mingking attivo.

Qualche idea qui?

TIA!

+0

Dov'è il controllo che stai cercando? È su Specific Master o MainMaster? – Streklin

+0

SpecificMaster ha il controllo. – klkitchens

risposta

18

Quando si annidano le pagine master, si otterrà un contenitore aggiuntivo "Contenuto" che è necessario esaminare.

Di conseguenza, se si sta cercando di utilizzare FindControl da una data pagina figlio il solito approccio è qualcosa per l'effetto di:

Label myLabel = (Label)this.Master.FindControl("myLabel"); 
myLabel.Text = "Success!"; 

Dal momento che abbiamo una pagina master nidificate, con "myLabel" nel master figlio, questo controllo sarà contenuto all'interno di un controllo del contenuto.

Quindi, questo cambia il codice per:

ContentPlaceHolder ph = (ContentPlaceHolder)this.Master.Master.FindControl("yourContentPane"); 

Label myLabel = (Label)ph.FindControl("myLabel"); 
myLabel.Text = "Success!"; 

e in VB.NET

Dim ph As ContentPlaceHolder = DirectCast(Me.Master.Master.FindControl("yourContentPane"), ContentPlaceHolder) 

Dim myLabel As Label = DirectCast(ph.FindControl("myLabel"), Label) 
myLabel.Text = "Success!" 

Il contenuto della pagina figlio viene caricato nel primo controllo pagina master, che è successivamente caricato nella pagina principale dei nonni.

+2

ding ding ding ding abbiamo un vincitore !!! – klkitchens

+1

Questo è ancora più confuso se si dispone di 3 livelli di file di pagina master. Fondamentalmente si può ottenere solo il controllo andando in cima livello masterpage e drill down attraverso tutti i controlli dei segnaposto contenuti fino a raggiungere quello che stai cercando. –

+2

@LandonPoch, sì, non mi sembra molto intuitivo. – Justin

3

hai provato this.Master.Master.FindControl("controlname");?

+0

Sì ... l'ho provato senza successo :( – klkitchens

+0

Oh, pensavo che il main master avesse il controllo: – somacore

+0

@somacore - Dice che il suo controllo è inMaster specifico, che è quello tra la pagina figlio e il master di livello superiore –

0

Esso funziona anche per cross-page postback:

ContentPlaceHolder ph = (ContentPlaceHolder) PreviousPage.Master.FindControl ("ContentPlaceHolder");

string txt = ((TextBox) (ph.FindControl ("UserTextBox"))). Testo;

0

solito faccio questo:

(TextBox)this.Master.FindControl("ContentplaceHolder1").FindControl("TextBox1"); 
0
HyperLink hl = (HyperLink)Master.Master.FindControl("HyperLink3"); 

questo è il modo più semplice per trovare i controlli dalle pagine master nidificate.

0

Il mio scenario era il seguente. Non sono sicuro che questa configurazione sia quella corretta, ma mi ha permesso di avere l'impostazione della pagina del submaster master e di essere in grado di trovare il controllo.

MasterPage-> SubMasterPage -> ASPX pagina

MasterPage:

<asp:ContentPlaceHolder ID="MasterPageContentPlaceHolder" runat="server"> 
</asp:ContentPlaceHolder> 

SubMasterPage:

<asp:Content ID="ModuleMainContent" ContentPlaceHolderID="MasterPageContentPlaceHolder" runat="server"> 
<asp:ContentPlaceHolder ID="MainContent" runat="server"> 
</asp:ContentPlaceHolder> 

aspx.cs:

ContentPlaceHolder MainContent = (ContentPlaceHolder)this.Master.Master.FindControl("MasterPageContentPlaceHolder").FindControl("MainContent"); 
    TextBox var_type = MainContent.FindControl("air") as TextBox;