2009-10-16 33 views
8

En un sitio, solo estoy usando una página maestra de un nivel y en una página que usa ese maestro, puedo hacer esto. Master.FindControl ("controlName") para acceder al control. Funciona bien.Páginas maestras anidadas y .FindControl

Sin embargo, utilizando el mismo código en un sitio con dos niveles de página maestra. MainMaster y SpecificMaster que tiene MainMaster como Master.

Por lo tanto, en la página que utiliza SpecificMaster, FindControl devuelve nulo para el objeto. La única diferencia que veo es la anidación de las páginas maestras.

Cuando configuro el punto de interrupción y miro en page.Master, muestra SpecificMaster y SpecificMaster muestra MainMaster como su maestro correctamente, pero FindControl sigue fallando.

Cuando veo el código fuente en IE, el control se nombra correctamente, no se está produciendo el corte de .NET.

¿Algún comentario aquí?

TIA!

+0

¿Dónde está el control que está buscando? ¿Está en Master específico o MainMaster? – Streklin

+0

SpecificMaster tiene el control. – klkitchens

Respuesta

18

Cuando anide páginas maestras, obtendrá un contenedor adicional de "Contenido" que necesita revisar.

Como resultado, si usted está tratando de utilizar FindControl de una página secundaria dado el enfoque habitual es algo en el sentido de:

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

Puesto que tenemos una página maestra anidada, con "myLabel" en el maestro secundario, este control estará contenido dentro de un control de contenido.

Por lo tanto, esto cambia el código para:

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

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

y en 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!" 

El contenido de la página secundaria se carga en el primer control de página maestra, la cual es posteriormente cargados en la página maestra de abuelos.

+2

ding ding ding ding tenemos un ganador !!! – klkitchens

+1

Esto es aún más confuso si tiene 3 niveles de archivos de página maestra. Básicamente, solo puede obtener su control yendo a la parte superior nivele el archivo de página maestra y explore todos los controles de marcador de posición de contenido hasta llegar a lo que está buscando. –

+2

@LandonPoch, sí, eso no me parece muy intuitivo. – Justin

3

¿Has probado this.Master.Master.FindControl("controlname");?

+0

Sí ... lo intenté en vano :( – klkitchens

+0

Oh, pensé que el maestro principal tenía el control – somacore

+0

@somacore - Dice que su control está en specificMaster, que es el que está entre la página secundaria y el maestro de nivel superior –

0

Se está trabajando, así como para entre páginas devolución de datos:

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

cadena txt = ((TextBox) (ph.FindControl ("UserTextBox"))). Texto;

0

que suelo hacer esto:

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

Esta es la forma más fácil de encontrar los controles de las páginas maestras anidadas.

0

Mi situación era la siguiente. No estoy seguro de si esta configuración es la correcta, pero me permitió tener la configuración de la página maestra-submaster y poder encontrar el control.

MasterPage-> SubMasterPage -> ASPX página

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; 
Cuestiones relacionadas