2008-08-08 19 views
11

¿Es posible acceder a un elemento en una página maestra desde la página cargada dentro del ContentPlaceHolder para el maestro?¿Cómo acceder al elemento .Net en la página maestra desde una página de contenido?

Tengo un ListView que enumera los nombres de las personas en un área de navegación en la página Maestra. Me gustaría actualizar el ListView después de que se haya agregado una persona a la tabla a la que ListView está vinculado a los datos. El ListView actualmente no actualiza sus valores hasta que se vuelva a cargar el caché. Hemos encontrado que simplemente volver a ejecutar el ListView.DataBind() actualizará el contenido de una lista de vista. No hemos podido ejecutar el ListView.DataBind() en una página que utiliza la página maestra.

A continuación se muestra un ejemplo de lo que quería hacer, pero dice que un error del compilador

"PeopleListView no existe en el contexto actual"

GIS.master - ¿Dónde reside ListView

...<asp:ListView ID="PeopleListView"... 

GISInput_People.aspx - Usos GIS.master ya que es la página principal

GISInput_People.aspx.cs

AddNewPerson() 
{ 
    // Add person to table 
    .... 

    // Update Person List 
    PeopleListView.DataBind(); 
    ... 
} 

¿Cuál sería la mejor manera de resolver un problema como este en C# .Net?

Respuesta

17

Creo que usted podría hacer esto mediante el uso de this.Master.FindControl o algo similar, pero que probablemente no debería - que requiere la página de contenido a saber demasiado acerca de la estructura de la página principal.

Sugeriría otro método, como disparar un evento en el área de contenido que el maestro podría escuchar y volver a unir cuando se dispare.

-1

Suponiendo página de su maestro fue nombrado MyMaster:

(Master as MyMaster).PeopleListView.DataBind(); 

Editar: puesto será declarado PeopleListView protegido por defecto, usted necesitará cambiar esto a pública, o crear un envoltorio de propiedad pública para que puedes acceder desde tu página.

4

Suponiendo que el control se denomina "PeopleListView" en la página maestra

ListView peopleListView = (ListView)this.Master.FindControl("PeopleListView"); 
peopleListView.DataSource = [whatever]; 
peopleListView.DataBind(); 

Pero @palmsey es más correcto, especialmente si su página podría tener la posibilidad de más de una página maestra. Desacoplarlos y usar un evento.

1

Una idea para recordar es la siguiente directiva ASP.NET.

<%@ MasterType attribute="value" [attribute="value"...] %> 

MSDN Reference

Le ayudará al hacer referencia a this.Master mediante la creación de una referencia inflexible a la página maestra. A continuación, puede hacer referencia a su ListView sin necesidad de CAST.

0

puede acceder con el código this.Master.FindControl (ControlID) que control desea. Devuelve la referencia del control, para que los cambios sean efectivos. acerca de disparar un evento no podría ser posible en cada situación.

2

Opción 1: puede crear una propiedad pública de su control página maestra

public TextBox PropMasterTextBox1 
{ 
    get { return txtMasterBox1; } 
    set { txtMasterBox1 = value; } 
} 

acceder a ella en la página de contenido como

Master.PropMasterTextBox1.Text="SomeString"; 

Opción 2: en la página principal:

public string SetMasterTextBox1Text 
{ 
    get { return txtMasterBox1.Text; } 
    set { txtMasterBox1.Text = value; } 
} 

en la página del contenido:

Master.SetMasterTextBox1Text="someText"; 

opción 3: puede crear algún método público que funciona para usted


éstos enfoque no es tan útil, sino que ayuda si lo que desea es utilizar un control limitado y predefinido

+0

Gracias, esto funciona Sin embargo, debe convertirlo: ((myMasterPage) Maestro) .SetMasterTextBox1Text = "someText"; –

+0

depende de su implementación ... para una sola página maestra no es necesario. y su implementación real sería muy compleja, tal ejemplo básico (como Imprimir "¡Hola mundo!") – BrainCoder

+0

Este es el método que utilicé, sin el cambio adicional de Serguei. Funciona muy bien haciendo exactamente lo que necesitaba. Probablemente debería haber sido marcado como la respuesta, también. +1 – James

Cuestiones relacionadas