Comment accéder à l'élément .Net sur la page maître à partir d'une page de contenu ?

StackOverflow https://stackoverflow.com/questions/6406

  •  08-06-2019
  •  | 
  •  

Question

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

J'ai un ListView qui répertorie les noms des personnes dans une zone de navigation sur la page maître.Je voudrais mettre à jour le ListView après qu'une personne ait été ajoutée à la table à laquelle les données du ListView sont liées.Le ListView ne met actuellement pas à jour ses valeurs jusqu'à ce que le cache soit rechargé.Nous avons constaté qu'il suffit de réexécuter le ListView.DataBind() mettra à jour le contenu d'une liste.Nous n'avons pas pu exécuter le ListView.DataBind() sur une page qui utilise la page maître.

Vous trouverez ci-dessous un exemple de ce que je voulais faire mais une erreur du compilateur indique

"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 page maître

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 ?

Était-ce utile?

La solution

je te crois pourrait faites-le en utilisant this.Master.FindControl ou quelque chose de similaire, mais vous ne devriez probablement pas le faire - cela nécessite 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 le déclenchement d'un événement dans la zone de contenu que le maître pourrait écouter et relier une fois déclenché.

Autres conseils

En supposant que le contrôle s'appelle "PeopleListView" sur la page maître

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

Mais @palmiers est plus correct, surtout si votre page peut avoir la possibilité de plusieurs pages maîtres.Découplez-les et utilisez un événement.

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

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

accédez-y sur la page de contenu comme

Master.PropMasterTextBox1.Text="SomeString";

Option 2:sur la page maître :

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

sur la page de contenu :

Master.SetMasterTextBox1Text="someText";

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


cette approche n'est pas très utile mais elle est utile si vous souhaitez simplement utiliser un contrôle limité et prédéfini

Il convient de retenir la directive ASP.NET suivante.

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

Référence MSDN

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

vous pouvez accéder avec le code this.Master.FindControl(ControlID) au contrôle que vous souhaitez.Il renvoie la référence du champ, pour que les modifications soient effectives.le déclenchement d'un événement ne pourrait pas être possible dans chaque situation.

En supposant que votre page maître s'appelle MyMaster :

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

Modifier: puisque PeopleListView sera déclaré protégé par défaut, vous devrez soit le changer en public, soit créer un wrapper de propriété publique afin de pouvoir y accéder depuis votre page.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top