2009-10-16 13 views
8

W jednej witrynie używam tylko strony Masterpage na jednym poziomie i na stronie używającej tego wzorca, mogę to zrobić.Master.FindControl ("controlName"), aby uzyskać dostęp do formantu. Działa w porządku.Zagnieżdżone strony wzorcowe i .FindControl

Jednak za pomocą tego samego kodu na stronie z dwoma poziomami strony głównej. MainMaster i SpecificMaster, który ma Master Master jako Master.

Tak więc na stronie, która używa SpecificMaster, FindControl zwraca wartość zerową dla obiektu. Jedyną różnicą, jaką widzę, jest zagnieżdżanie stron wzorcowych.

Kiedy ustawiam breakpoint i patrzę na page.Master, pokazuje on SpecificMaster, a SpecificMaster pokazuje MainMaster jako swojego mistrza poprawnie, ale FindControl wciąż nie działa.

Kiedy przeglądam źródło w IE, formant jest poprawnie nazwany, nie ma włączonego.

Jakieś myśli tutaj?

TIA!

+0

Gdzie jest kontrola, której szukasz? Jest na określonym Master lub MainMaster? – Streklin

+0

SpecificMaster ma kontrolę. – klkitchens

Odpowiedz

18

Podczas zagnieżdżania stron wzorcowych otrzymasz dodatkowy kontener "Zawartość", który musisz przejrzeć.

W rezultacie, jeśli starasz się używać FindControl z danej strony dziecka zwykle podejście jest coś do skutku:

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

Ponieważ mamy zagnieżdżonych stronę wzorcową, z „myLabel” w kontrolerze nadrzędnej kontrola ta będzie zawarta w ramach kontroli treści.

Tak, to zmienia kod do:

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

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

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

treści z strony dziecka jest ładowany do pierwszej kontroli strony wzorcowej, która jest następnie załadowane na stronę wzorcową grandparent.

+2

ding ding ding mamy zwycięzcę !!! – klkitchens

+1

To jest jeszcze bardziej zagmatwane, jeśli masz 3 poziomy plików stron wzorcowych.Zasadniczo możesz uzyskać kontrolę tylko przechodząc na górę poziom pliku masterpage i przechodzenie przez wszystkie formanty symboli zastępczych zawartości, aż dojdziesz do tego, czego szukasz. –

+2

@LandonPoch, tak, to nie wydaje mi się zbyt intuicyjne dla mnie – Justin

3

wypróbowałeś this.Master.Master.FindControl("controlname");?

+0

Tak ... po prostu próbowałem, ale bez skutku :( – klkitchens

+0

Och, myślałem, że główny mistrz miał kontrolę – somacore

+0

@somacore - Mówi, że jego kontrola jest w specificMaster, która jest jedna między stroną podrzędną a mistrzem najwyższego poziomu –

0

to działa także w przekroju widoku odświeżenie:

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

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

0

I zazwyczaj to zrobić:

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

Jest to najprostszy sposób na znalezienie elementów sterujących z zagnieżdżonych stron wzorcowych.

0

Mój scenariusz wyglądał następująco. Nie jestem pewien, czy to ustawienie jest poprawne, ale pozwoliło mi to na skonfigurowanie strony głównej submaster i może znaleźć kontrolę.

MasterPage-> SubMasterPage -> ASPX stronę

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; 
Powiązane problemy