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.
Ich bin mir ziemlich sicher, dass du ein Speicherleck durch die Speicherung der event-handler in es 😉
InformationsquelleAutor | 2009-07-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie nicht ausdrücklich erwähnen, an welchem Punkt der Seite lifecycle-tun Sie erstellen und fügen Sie diese Steuerelemente. Für den postback zu wirken, die Schöpfung(und die Verkabelung) und 're-creation' hat zu sein getan vor dem page_load-Ereignis.
Tun es in der page_init und die viewstate-Mechanismus übernehmen sollte der postback-Werte, wenn die IDs dieselben sind.
Habe ich über eine andere Methode, hier aber:
http://www.codeproject.com/KB/viewstate/retainingstate.aspx
InformationsquelleAutor o.k.w
Was ist Ihre motivation für dynamisch das Steuerelement einfügen in einen Platzhalter? Die eine Seite existiert nicht wirklich zwischen den Anforderungen, so dass alle Steuerelemente, die dynamisch eingefügt, nicht überleben. Sie hatte im Grunde müssen es imitieren.
Eine option, die Sie betrachten wünschen können, ist das schreiben ein benutzerdefiniertes Steuerelement, das hat verschiedene rendering-Modi, aber ein konsistentes event-interface. Eine andere ist die Verwendung einer ASP.NET MultiView-Steuerelement, das wird nur machen die sichtbare Ansicht in der HTML-aber immer noch behauptet, der event-Handler in das unsichtbare Sichten.
InformationsquelleAutor Jacob
Okay, korrigiert mich wenn ich falsch bin, Ihr Create () - Methode tatsächlich instanziiert und stellt Ihre innere Kontrolle in einem bekannten Zustand; ich sehe, dass Sie bereits einen Verweis auf den Knopf, dann warum brauchen Sie eine zusätzliche Click-Ereignis an dieser Stelle?
Beim Aufruf Create() initialisiert das Steuerelement und die zugehörige Taste, dann, wenn Sie wissen, dass der button da ist, hook up Ihr event handler übergeben, die parameter, die Sie es bekommen.
InformationsquelleAutor user134706
Sollten Sie immer die gleiche ID zu dynamisch erstellten controls, wenn Sie versäumen es manchmal control-Ereignisse werden nicht ausgelöst,
hoffe, dass dies helfen.
InformationsquelleAutor dev-cu