Wie zu Zugang .Net element auf der Master-Seite aus einer Content-Seite?
Frage
Ist es möglich, den Zugriff auf ein element auf einer Master-Seite, von der Seite geladen innerhalb des ContentPlaceHolder
für den master?
Ich habe eine ListView, die Listen die Namen von Personen in einen Navigationsbereich auf der Master-Seite.Ich möchte Aktualisierung der ListView nach einer person wurde der Tabelle Hinzugefügt, die das ListView-Steuerelement an Daten gebunden ist.Die ListView
derzeit nicht aktualisiert es die Werte, bis der cache neu geladen wird.Wir haben festgestellt, dass nur ein erneutes ausführen des ListView.DataBind()
update listview-Inhalt.Haben wir nicht in der Lage zu laufen die ListView.DataBind()
auf einer Seite befindet, verwendet die Master-Seite.
Unten ist ein Beispiel, was ich tun wollte aber einen compiler-Fehler, der sagt
"PeopleListView existiert nicht im aktuellen Kontext"
- GIS.Meister -, Wo ListView befindet
...<asp:ListView ID="PeopleListView"...
GISInput_People.aspx - GIS Verwendet.master-wie master-Seite
GISInput_People.aspx.cs
AddNewPerson()
{
// Add person to table
....
// Update Person List
PeopleListView.DataBind();
...
}
Was wäre der beste Weg, um ein Problem zu beheben, wie dies in C# .Net?
Lösung
Ich glaube, Sie könnte tun Sie dies durch die Nutzung dieser.Master.FindControl oder etwas ähnliches, aber Sie sollte wohl nicht - es erfordert die Inhalte der Seite zu wissen zu viel über die Struktur des master-Seite.
Ich würde vorschlagen, ein anderes Verfahren, wie das auslösen eines Ereignisses im content-Bereich, der Meister konnte hören und neu zu binden, wenn Sie abgefeuert werden.
Andere Tipps
Vorausgesetzt, die Steuerung wird als "PeopleListView" auf der master-Seite
ListView peopleListView = (ListView)this.Master.FindControl("PeopleListView");
peopleListView.DataSource = [whatever];
peopleListView.DataBind();
Aber @palmsey ist mehr richtige, vor allem, wenn Ihre Seite hätte die Möglichkeit, mehr als eine master-Seite.Entkoppeln Sie Sie und verwenden Sie eine Veranstaltung.
Option 1 :Sie können erstellen öffentliches Eigentum Ihrer master-Seite kontrollieren
public TextBox PropMasterTextBox1
{
get { return txtMasterBox1; }
set { txtMasterBox1 = value; }
}
Zugriff auf Inhalte der Seite wie
Master.PropMasterTextBox1.Text="SomeString";
Option 2:auf der Master-Seite:
public string SetMasterTextBox1Text
{
get { return txtMasterBox1.Text; }
set { txtMasterBox1.Text = value; }
}
auf den Inhalt der Seite:
Master.SetMasterTextBox1Text="someText";
option 3 :können Sie einige öffentliche Methode, die für Sie arbeitet
dieser Ansatz ist nicht so nützlich, aber es hilft, wenn Sie nur wollen, um zu verwenden einige begrenzten und vordefinierten control
Man denke sich zu erinnern, ist die folgende ASP.NET Richtlinie.
<%@ MasterType attribute="value" [attribute="value"...] %>
Es wird Ihnen helfen, wenn Sie verweisen auf dieses.Master durch das erstellen einer stark typisierten Verweis auf die master-Seite.Anschließend können Sie Ihre Referenz ListView, ohne zu werfen.
Sie können den Zugriff mit der code this.Master.FindControl(ControlID), die Kontrolle, die Sie wünschen.Es gibt den Verweis auf das Steuerelement, damit die änderungen wirksam sind.über das auslösen eines Ereignisses konnte nicht möglich sein, in jeder situation.
Vorausgesetzt, dass Ihr master-Seite hieß MyMaster:
(Master as MyMaster).PeopleListView.DataBind();
Edit: seit PeopleListView erklärt wird, geschützt durch Standard, Sie müssen entweder ändern Sie dies in öffentlichen oder erstellen Sie eine öffentliche Eigenschaft wrapper, so dass Sie können Zugang es von Ihrer Seite.