Frage

Ich versuche, eine Web-Seite zu erstellen, die eine entsprechende Benutzersteuerung auf dem ausgewählten Wert eines Dropdown-Liste basiert werden angezeigt.

Grundsätzlich ist das Seitenlayout, ist dies:

Drop Down Auswahl
< User Control erstellt basierend auf Drop-Down-Auswahl >

Ich habe es halb arbeiten ... die Kontrollen ändern sich, wenn sich die Auswahl ändert. In OnInit (), ich das letzte ausgewählte Steuerelement dynamisch erstellen (dessen Wert wird in den Sitzungszustand gespeichert, weil Viewstate bei OnInit nicht verfügbar ist).

Wenn Sie die Dropdown-Auswahl Änderung auftritt, entferne ich die alte Benutzersteuerung, und fügen Sie eine neue. Das Problem ist: mit der neuen Steuerung von der Auswahl verändert Ereignisse hinzugefügt wird, ich bin nicht in der Lage Änderungen vom Benutzer auf dem ersten Postbacks speichern . Nach der ersten Post zurück, wird die ausgewählte Steuerung von OnInit erstellt anstelle des Change-Ereignisses und Zustand wird ab dann gespeichert, bis zum nächsten Auswahl zu ändern.

Hier ist die Methode Selection:

protected void SelectionChanged(object sender, EventArgs e)
{
    SelectedValue = int.Parse(DropDownList.SelectedValue);  //Store in Session
    Control userControl = GetSpecificUserControl(SelectedValue);
    PlaceHolder1.Controls.Clear();   // Remove old user control
    PlaceHolder1.Controls.Add(userControl);
}

Jede auf die neue Steuerung vorgenommenen Änderungen durch den Benutzer nach Selection sind geschieht auf folgende Posten zurück nicht gespeichert. Allerdings nachfolgende Postbacks tun gerettet werden. An diesem Punkt wird die Steuerung immer in OnInit () erstellt wird.

Gibt es eine Möglichkeit die richtige Post zu zwingen, zurück und Viewstate, wenn die Steueränderungen? Ist es möglich, eine Seite Neu-Initialisierung zu erzwingen, nachdem die Steuerung geändert wird?

War es hilfreich?

Lösung

Dies ist das klassische tear-your-Haar-oute Problem mit ASP.Net Webforms. Sie haben mehrere Möglichkeiten:

1) Dies ist ein bisschen wie ein Hack, da sie außerhalb des beabsichtigten Seitenlebenszyklus etwas geht, aber nach meiner Erfahrung ist es der direkteste Weg, mit dem Problem umzugehen. Wenn die Seite Beiträge während Request["MyDropDownID"] zurück aus der Dropdown-Auswahlereignis, einfach Umfrage Init() für den ausgewählten Wert der Drop-down-Steuerung -. Für das OnMyDropDownChanged() Ereignis warten Sie nicht, Ihre Seite einrichten

2) Implementieren Sie Ihre eigenen Viewstate Handhabung für Ihre Benutzersteuerungen. Dies erfordert in der Dokumentation Viewstate Graben und überschreibt eine Reihe von Methoden.

3) Joels Lösung. Er schlug mich, aber ich habe versucht, ersten Beitrag zu bekommen: p

Andere Optionen beinhalten Buchungswerte mit Hilfe von JavaScript und so, aber diejenigen bekommen wirklich chaotisch.

Andere Tipps

Was Sie tun müssen, ist den letzten bekannten Wert der Dropdownlist in der Session zu halten. Dann gilt:

OnInit:

  • Erstellen Sie, was die Steuerung von dem gespeicherten Wert in der Sitzung angegeben

Selection Ereignis

  • Entfernen, was Sie während OnInit erstellt
  • Erstellen und neue Steuerelement hinzufügen, basierend auf neue Dropdownlist-Auswahl
  • Speichern neue Dropdownlist-Auswahl Sitzung

Auf diese Weise auf der nächsten Postback nach einer Änderung des Steuer Sie neu zu erstellen, die finden Ansichtszustand erwartet, und so ist es Zustand wiederhergestellt wird.

Dynamische Kontrollen können sehr pingelig sein. Oft ist es einfacher, alle Steuerelemente erstellen Sie könnten mögliche Notwendigkeit und setzen ihre Visible Eigenschaften auf false gesetzt. So können sie an den Browser überhaupt nicht machen. Dann Visible auf true gesetzt nur für die Steuerelemente, die Sie benötigen, wenn Sie sie benötigen.

Wenn die Liste der Optionen, die nicht zu groß ist, können Sie einfach alle Steuerelemente statisch Benutzer rendern und JavaScript / jQuery verwenden, um die entsprechenden Kontrollen ein- / auszublenden auf den Wert der Drop-Down-Basis (Onchange js Ereignis). Sie können den Drop-Down-Wert verwenden Sie die entsprechenden Werte aus den Benutzersteuerungen zu extrahieren, wenn speichern.

Sie vermeiden den Schmerz mit dynamischen Kontrollen des Umgangs, bieten eine ansprechende Benutzeroberfläche, wenn sie aus der Dropdown (kein Postback) Auswahl, etc ...

Sie das Steuerelement in den SelectedIndexChanged-Handler nicht hinzufügen, fügen Sie es während Page_Load. Sie müssen nur den Wert der Drop-Down-Test müssen jedes Mal, wenn die Seite geladen wird, und laden Sie die richtige Steuerung für diesen Wert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top