2009-04-23 5 views
3

Auf Page_Init erstelle ich eine Tabelle von dynamisch erstellten Steuerelementen basierend auf ein paar Datenbanktabellen. Eines der Steuerelemente ist ein ImageButton zum Verschieben eines Listenelements in der Liste. Dieser Ereignishandler aktualisiert die Spalte SortOrder in der Datenbank für die betroffenen Elemente.Wie aktualisiere ich die Seitendaten nach der Ereignisbehandlung?

Jetzt ist das Problem, dass die Steuerelemente in dem Page_Init-Ereignis erstellt werden und der SortOrder später aktualisiert wird, wenn das ImageButton-Befehlsereignis ausgelöst wird. Was ist das beste Verfahren zum Aktualisieren der Tabelle mit der richtigen Sortierreihenfolge? Wenn ich die Tabelle neu erstelle, nachdem das Ereignis ausgelöst wurde, funktioniert das ImageButton-Befehlsereignis nicht mehr.

  • Sollte ich eine Methode implementieren, um die Daten in der Tabelle zu aktualisieren, ohne sie neu zu erstellen?
  • Sollte ich die Seite in Code nach dem Ereignis neu geladen haben?

Was ist Ihre bevorzugte Lösung dieses Problems?

Antwort

8

Seite Ereignisse wie Init und Load feuert immer vor dem Event-Handler, der die Postbacks ausgelöst. Dies ist die Grundlage der Page lifecycle (Für eine visuelle Darstellung von Peter Bromberg, see here). Die meisten neuen ASP.NET-Entwickler haben ein großes Problem, dieses "Dilemma" zu verstehen und angemessen zu behandeln.

Der ideale Weg, dies zu tun ist:

ein. Ihre Page_Init sollte eine Prozedur aufrufen (nennen wir es BindData() zur Veranschaulichung), die die Erstellung der Tabelle basierend auf Datenbankdaten behandelt. Diese Methode ähnelt einer Bindungsmethode, die an die Datenbankdaten bindet und UI-Elemente auf der Grundlage dieser Bindung rendert. IOW, sollten Sie den Tabellenerstellungscode aus der Page_Init-Methode entfernen und in eine separate Methode einfügen, damit er bei Bedarf aufgerufen werden kann.

Wichtiger Hinweis: DieseBindData() Methode übernimmt auch die Befestigung des Eventhandler für die dynamisch erstellte Image Steuerung an die Steuerung. Wir nennen das ImageButton_Click. Dies ist entscheidend für die Steuerung des Ereignisses beim nachfolgenden Postback.

b.Wenn Ihre ImageButton_Click-Methode ausgeführt wird, ruft sie die BindData()-Methode auf, um die Tabelle und ihre Bindungen neu zu erstellen, jedoch mit neuen Sortierreihenfolgenregeln.

also die Reihenfolge der Ausführung auf dem ersten Last:

  1. Page_Init
  2. BindData()

Die Reihenfolge der Ausführung bei zukünftigen Lasten (auf Postbacks) ist:

  1. Page_Init
  2. BindData() - Ereignishandler für ImageButton angefügt.
  3. ImageButton_Click
  4. BindData()
4

Sie werden so etwas wie dieses brauchen ...

  • OnInit (IsPostBack = false)
    • dynamisch erstellen Image
    • Wireup Image Event Handler
    • laden Tabelle - Prüfen Sie, ob ein Sortierung in Session/Variable.Wenn keine; verwenden Sie den Standard

die Schaltfläche

  • OnInit (IsPostBack = true/1. Postback)

    • dynamisch neu erstellen Image
    • Wireup Image Ereignis Handler
    • laden Tabelle - mit Standard-Sortierung
  • ImageButton_OnClick (Immer noch die gleiche erste Postbacks)

    • Reload Tabelle - mit bestimmten Sortierreihenfolge
    • Speichern Sie diese Art Ordnung Variable in Viewstate/Session-Variablen

Ursache einige andere Postback

  • OnInit (IsPostBack = true/2. & Nachfolgende Postbacks)
    • dynamisch Image
    • Wireup Image Event Handler
    • laden Tabelle erstellen - Überprüfen Sie für eine Art Ordnung in Session/Variable. Wenn GEFUNDEN, verwende das.
+0

Telepathie, ich sage dir! +1 – Cerebrus

+0

Was sagen sie über "Great Minds" ;-) –

+0

ummm ... "Große Köpfe stimmen für einander"? ;-) – Cerebrus

1

Erstens scheinen Sie Ihre Daten manuell zu UI-Steuerelemente verbindlich. In Asp.Net gibt es und viele Möglichkeiten, dies zu vermeiden, mit integrierten Datenbindungstechniken. Viele Steuerelemente wie GridView ermöglichen die automatische Erstellung von Html-Tabellen aus einer bestimmten Datenquelle. Es gibt viele andere Optionen einschließlich Repeater.

Wie auch immer Sie sich entscheiden, Ihre Daten zu binden, besteht die Technik darin, zu jedem Zeitpunkt während des Seitenlebenszyklus erneut zu binden.

Sie müssen ...

  1. Binden Sie Daten auf der ersten Seite zu laden, mit der Standardsortierreihenfolge
  2. die Daten in der Event-Handler-Bild-Taste des Rebind nachdem die Sortierreihenfolge geändert wurde.

Der Code in etwa so aussehen würde ...

private void Page_Load (...) 
{ 
    if (!IsPostBack) 
     //On First Load 
     BindData(defaultSoortOrder); 
    else 
     BindData(currentSortOrder);    
} 

private void ImageButton_Click (...) 
{ 
    currentSortOrder = newSortOrder; 
    BindData(currentSortOrder); 
} 

Wenn die Bild-Schaltfläche geklickt wird, werden Sie zweimal Aufruf BindData enden. Dies ist jedoch notwendig, da ein Seitenpostback von jedem Steuerelement initiiert werden kann. Sie müssen immer sicherstellen, dass Sie die Daten binden, wenn die Seite geladen wird.

Verwandte Themen