2009-10-16 5 views
8

하나의 사이트에서 하나의 레벨 Masterpage 만 사용하고 있으며 해당 마스터를 사용하는 페이지에서 this.Master.FindControl ("controlName")을 사용하여 컨트롤에 액세스 할 수 있습니다. 잘 작동합니다.중첩 된 마스터 페이지 및 .FindControl

그러나 두 개의 마스터 페이지 수준이있는 사이트에서 동일한 코드를 사용하십시오. MainMaster와 Master를 가지고있는 SpecificMaster.

따라서 SpecificMaster를 사용하는 페이지에서 FindControl은 객체에 대해 null을 반환합니다. 내가 보는 유일한 차이점은 마스터 페이지의 중첩입니다.

page.Master를 보았을 때 SpecificMaster가 표시되고 SpecificMaster가 MainMaster를 마스터로 올바르게 표시하지만 FindControl은 여전히 ​​실패합니다.

IE에서 소스를 볼 때 컨트롤의 이름이 올바르게 지정되고 .NET munging이 수행되지 않습니다.

여기에 의견이 있으십니까?

TIA!

+0

찾고 계신 컨트롤은 어디에 있습니까? 특정 마스터 또는 MainMaster에 있습니까? – Streklin

+0

SpecificMaster가 제어 할 수 있습니다. – klkitchens

답변

18

마스터 페이지를 중첩하면보아야 할 "콘텐트"컨테이너가 추가로 생깁니다. 주어진 자식 페이지에서의 FindControl를 사용하려고하는 경우 그 결과

은, 일반적인 접근 방식의 효과에 뭔가 :

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

우리는 "myLabel"와 중첩 된 마스터 페이지를 가지고 있기 때문에 자식 마스터에서이 컨트롤은 내용 컨트롤 안에 포함됩니다. 되는 첫 번째 마스터 페이지 컨트롤에로드 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!" 

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

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

에서 자식 페이지에서 내용을 :

그래서,이에 코드를 변경 조부모 마스터 페이지에로드됩니다. ;

의 ContentPlaceHolder pH는 (의 ContentPlaceHolder) PreviousPage.Master.FindControl ("의 ContentPlaceHolder")

+2

우리는 승자가있어 땡땡 울고 땡땡 울고있다! – klkitchens

+1

이것은 마스터 페이지 파일의 3 가지 수준이 있다면 훨씬 더 혼란 스럽다. 기본적으로 당신은 컨트롤 –

+2

@LandonPoch, 그렇습니다. 나에게 매우 직관적이지는 않습니다. – Justin

3

시도해 보셨습니까? this.Master.Master.FindControl("controlname");?

+0

예 ... 그냥 쓸모가 없어 보았습니다. ( – klkitchens

+0

오, 마스터 주인이 제어 할 수 있다고 생각했습니다. – somacore

+0

@somacore - 자신의 제어가 하위 페이지와 최상위 마스터 사이의 특정 마스터에 있다고합니다. –

0

는 페이지 간 게시뿐만 아니라 작동

문자열 txt = ((TextBox) (ph.FindControl ("UserTextBox"))). 텍스트.

0

나는 보통 이렇게 :

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

이 중첩 된 마스터 페이지에서 컨트롤을 찾을 수있는 가장 쉬운 방법입니다.

0

내 시나리오는 다음과 같습니다. 이 설정이 정확한지 확신 할 수 없지만 마스터 - 서브 마스타 페이지 설정이 가능하고 컨트롤을 찾을 수 있습니다.

MasterPage-> SubMasterPage -> ASPX 페이지

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; 
관련 문제