2008-08-08 4 views
11

Est-il possible d'accéder à un élément sur une page maître à partir de la page chargée dans le ContentPlaceHolder pour le maître?Comment accéder à l'élément .Net sur la page maître à partir d'une page de contenu?

J'ai un ListView qui répertorie les noms des personnes dans une zone de navigation sur la page principale. Je voudrais mettre à jour le ListView après qu'une personne a été ajoutée à la table à laquelle ListView est lié. Le ListView ne met pas à jour ses valeurs jusqu'à ce que le cache soit rechargé. Nous avons constaté que la ré-exécution du ListView.DataBind() mettrait à jour le contenu d'une liste. Nous n'avons pas été en mesure d'exécuter le ListView.DataBind() sur une page qui utilise la page principale.

est Ci-dessous un échantillon de ce que je voulais faire, mais une erreur du compilateur dit

« PeopleListView n'existe pas dans le contexte actuel »

GIS.master - Où réside ListView

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

GISInput_People.aspx - Utilise GIS.master comme il est la page principale

GISInput_People.aspx.cs

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

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

Quelle serait la meilleure façon de résoudre un problème comme celui-ci en C# .Net?

Répondre

17

Je crois que pouvez faire cela en utilisant this.Master.FindControl ou quelque chose de similaire, mais vous ne devriez probablement pas - il faut que la page de contenu en sache trop sur la structure de la page maître.

Je suggérerais une autre méthode, telle que déclencher un événement dans la zone de contenu que le maître pourrait écouter et re-lier lorsqu'il est déclenché.

-1

En supposant que votre page maître a été nommé MyMaster:

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

Edit: depuis PeopleListView sera déclarée protégée par défaut, vous devrez soit changer cela public ou créer un wrapper de biens publics de telle sorte que vous pouvez y accéder depuis votre page.

4

En supposant que le contrôle est appelé « PeopleListView » sur la page principale

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

Mais @palmsey est plus correct, surtout si votre page pourrait avoir la possibilité de plus d'une page maître. Découpez-les et utilisez un événement.

1

On pense à se souvenir de la directive ASP.NET suivante.

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

MSDN Reference

Il vous aidera lors du référencement this.Master en créant une référence fortement typé à la page principale. Vous pouvez ensuite référencer votre ListView sans avoir besoin de CAST.

0

vous pouvez accéder avec le code this.Master.FindControl (ControlID) dont vous souhaitez contrôler. Il renvoie la référence du contrôle, de sorte que les changements sont effectifs. à propos de tirer un événement ne pouvait pas être possible à chaque situation.

2

Option 1: vous pouvez créer une propriété publique de votre contrôle page maître

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

d'y accéder à la page du contenu comme

Master.PropMasterTextBox1.Text="SomeString"; 

Option 2: à la page principale:

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

sur Contenu Page:

Master.SetMasterTextBox1Text="someText"; 

option 3: vous pouvez créer une méthode publique qui fonctionne pour vous


ces approche est pas utile, mais il est utile si vous voulez juste utiliser un contrôle limité et prédéfini

+0

Merci, cela fonctionne. Cependant, vous devez le convertir: ((maMasterPage) Maître) .SetMasterTextBox1Text = "someText"; –

+0

cela dépend de votre implémentation ... pour une seule page maître, il n'est pas nécessaire de le faire. et votre mise en œuvre réelle serait loin complexe alors un tel exemple de base (comme Imprimer "Hello World!") – BrainCoder

+0

C'est la méthode que j'ai utilisée, sans changement supplémentaire de Serguei. Fonctionne très bien faire exactement ce dont j'avais besoin. Probablement aurait dû être marqué comme la réponse, aussi. +1 – James

Questions connexes