ASP.net dynamisch erstellte Steuerelement-Ereignis-handling

Im wesentlichen habe ich ein Platzhalter Hinzugefügt, um die Seite dynamisch beim laden der Seite.

Dann habe ich ein zusammengesetztes Steuerelement Hinzugefügt werden, ist der Platzhalter angezeigt und während der Laufzeit bestimmte Seite Veranstaltungen. Das zusammengesetzte Steuerelement eine Schaltfläche. Ich habe ein public-Event-Handler für den button in der composite-Kontrolle, aber eigentlich nicht haben direkten Zugang zu dieser eventhandler in den code der Seite.

Zur Anzeige der Steuerung, würde ich den folgenden Aufruf zum Beispiel:

MyControl.Create(args, new EventHandler(OnClick)); 

Dann auf der Seite hätte ich protected void OnClick(object o, EventArgs args) {}

Natürlich, wenn ich rufe create() ich Draht up my-Event-Handler, um das zusammengesetzte Steuerelement das button-click-Ereignis. So weit So gut. Mit der Taste wired, the Taste, klicken Sie auf Beiträge an die Steuerung zurück, wie erwartet. Doch die Veranstaltung macht es nie wieder auf der Seite event-handler.

Mir bewusst, dass das problem beim postback. Doch der Versuch, den Draht den Knopf auf init, load oder createchildcontrols alle nicht halten Sie die Verdrahtung, so dass der Fall gehandhabt werden kann, die auf die Seite. Was ich möchte, ist die Fähigkeit, übergeben Sie die Event-Handler, um das zusammengesetzte Steuerelement während der Laufzeit und für die composite-Steuerelement, um das Ereignis zu senden korrekt zurück zu der Seite, auf postback.

Interessanterweise, wenn ich den Anruf OnBubble mit benutzerdefinierte eventargs kann ich fangen die Perlen-event auf der Seite. Aber das problem ist, dass mein Platzhalter ist auf der Seite, also wenn ich versuche zu rufen MyControl.Create() in einem UserControl, zum Beispiel, die Blase geht auf die Seite und nicht auf das UserControl (wie erwartet). Daher, der Grund, warum ich lieber zu erklären, dass die Event-Handler anstelle von überschreiben OnBubble (Benutzersteuerelemente und anderen Steuerelementen, die erklären MyControl würde im wesentlichen nutzlos für die button-click-events).

Ich hoffe jemand hat ein paar Einblicke in das problem. Wie es scheint, ein Interessantes problem, aber vielleicht gibt es keine Lösung außerhalb zu deklarieren, die Kontrolle explizit auf die Seite, und direkt mit der Verdrahtung der Veranstaltung entweder im markup oder auf automatisch. Ich würde mit der Taste stellen wird ein asynchroner Rückruf, aber lieber standard ASP.NET event-handling, wenn möglich.

Dank!

Hinzufügen Klarstellung: die MyControl.Create() Anruf tatsächlich generiert ein Ereignis, das ruft das Zusammengesetzte Steuerelement ist Create() Methode. das ist ja alles schön und gut, aber es ist erwähnenswert, dass die MyControl.Create() Methode keinen direkten Zugriff auf das Steuerelement. Dies sollte Sinn machen, weil die das Steuerelement Hinzugefügt wird, um die Seite onload auf nicht im markup.

Mehr Code:

MyControl : CompositeControl 
{
     public event EventHandler Click;

     //I have a create method
     void Create(args, EventHandler click)
     {
          this.Click = click;
          //other processing
     }

     //then the button is wired up. I've tried in OnInit(), OnLoad()
     void CreateChildControls()
     {
           MyButton.OnClick += Click;
     }

     //if I wire up the button to a default handler I can check if
       Click is not null and send the click event onto the next handler 
     //this is where the bubble event works, but the wiring fails
} 

Edit: Mein Versuch zum speichern der Event-Handler in der Sitzung und verdrahten Sie die Taste auf postback erfolgreich war. Ich betrachte das nicht als gute Praxis, und ich glaube nicht, dass es tatsächlich dient meinem Zweck. Zum Beispiel, in diesem Fall, dass die Veranstaltung auf der Seite ausgeführt wird, wie erwartet, aber mit nicht-standard-Seite Verhalten. Zum Beispiel, Antwort.Redirect() eine exception wirft. Dies sollte Sinn machen, weil der eventhandler hat sich wohl verirrt Status-Informationen während des postback.
Ein paar Gedanken:
1. Ist es möglich, dass ich erstellen Sie eine benutzerdefinierte Blase Veranstaltung, die irgendwie mit dieser Steuerung? Dies scheint plausibel, aber wieder das problem der Seite postback lässt mich mit dem gleichen problem, wo Sie die Blase gehen sollte. So, wenn ich Anrufe, create(), ist es möglich, dass ich automatisch registrieren das UserControl als Ziel für die Blase? Es scheint schwierig.
2. Gibt es irgendeine Stelle in der Seite lifecycle-wo kann ich re-Draht die Veranstaltung auf dem UserControl-Event-Handler deklariert, so dass der Delegat aufgerufen wird, korrekt auf postback? Dies scheint zu sein, was ich bin fehlt. Der eventhandler wird erstellt, auf einem postback, aber ist verloren, weil es nicht neu erstellt in der UserControl-bei OnClick. Ich will nicht das Benutzersteuerelement zu müssen explizit neu erstellen Sie, die Sache, aber möchten, dass das Kind Kontrolle zu re-erstellen Sie für das Benutzersteuerelement. Es klingt wie eine einfache Anfrage, aber mit dem UserControl aus der Schleife, kann ich zu Fragen für das Unmögliche.

Kannst du etwas mehr code, wo Sie tatsächlich Draht, bis der handler?
Ich bin mir ziemlich sicher, dass du ein Speicherleck durch die Speicherung der event-handler in es 😉

InformationsquelleAutor | 2009-07-18

Schreibe einen Kommentar