2009-10-16 13 views
8

Auf einer Website verwende ich nur eine Masterpage mit einer einzigen Ebene und in einer Seite mit diesem Master kann ich dies tun.Master.FindControl ("ControlName") auf das Steuerelement zugreifen. Funktioniert gut.Verschachtelte Masterpages und .FindControl

Verwenden Sie jedoch den gleichen Code auf einer Website mit zwei Masterpage-Ebenen. MainMaster und SpecificMaster mit MainMaster als Master.

Auf der Seite, die SpecificMaster verwendet, gibt FindControl NULL für das Objekt zurück. Der einzige Unterschied, den ich sehe, ist die Verschachtelung der Masterseiten.

Wenn ich den Breakpoint setze und auf page.Master schaue, wird SpecificMaster angezeigt und SpecificMaster zeigt MainMaster korrekt als Master an, aber FindControl schlägt immer noch fehl.

Wenn ich Quelle in IE anzeigen, wird das Steuerelement richtig benannt, keine .NET Munging geht.

Irgendwelche Gedanken hier?

TIA!

+0

Wo ist die Kontrolle, nach der Sie suchen? Ist auf bestimmten Master oder MainMaster? – Streklin

+0

SpecificMaster hat die Kontrolle. – klkitchens

Antwort

18

Wenn Sie Masterseiten verschachteln, erhalten Sie einen zusätzlichen Container "Inhalt", den Sie durchsuchen müssen.

Als Ergebnis, wenn Sie versuchen, Findcontrol von einem bestimmten Kind Seite der übliche Ansatz zu verwenden ist etwas in der Art von:

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

Da haben wir eine verschachtelte Masterseite, mit „myLabel“ Im Child-Master wird dieses Steuerelement in einem Inhaltssteuerelement enthalten sein.

So ändert sich der Code:

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

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

und 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!" 

Der Inhalt aus der untergeordneten Seite in die erste Masterseite Steuerung geladen, das ist anschließend in die Großelternseite geladen.

+2

ding ding ding wir haben einen Gewinner !!! – klkitchens

+1

Das ist noch verwirrender, wenn Sie 3 Ebenen von Masterseiten haben.Sie können im Prinzip nur zu Ihrer Kontrolle gelangen, indem Sie nach oben gehen Level - Masterpage - Datei und Drilldown durch alle Content - Platzhalter - Steuerelemente, bis Sie das erreichen, was Sie suchen. –

+2

@LandonPoch, ja, das scheint mir nicht sehr intuitiv. – Justin

3

haben Sie versucht this.Master.Master.FindControl("controlname");?

+0

Ja ... habe es nur vergeblich versucht :( – klkitchens

+0

Oh, ich dachte, der Hauptmeister hätte die Kontrolle. – somacore

+0

@somacore - Es sagt, dass seine Kontrolle in specificMaster ist, das ist die zwischen der untergeordneten Seite und der obersten Ebene Master –

0

Es arbeitet auch für Cross-Seite Postbacks:

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

Zeichenfolge txt = ((TextBox) (ph.FindControl ("UserTextBox"))). Text;

0

ich dies in der Regel tun:

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

Dies ist der einfachste Weg ist, steuert von den verschachtelten Master-Seiten zu finden.

0

Mein Szenario war wie folgt. Ich bin mir nicht sicher, ob diese Einstellung die richtige ist, aber ich konnte die Master-Submaster-Seite einrichten und die Steuerung finden.

MasterPage-> SubMasterPage -> ASPX Seite

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;