/ / Ereignisse auf ASP.NET UserControl lösen jeden zweiten Klick aus? - asp.net, Ereignisse, Benutzersteuerungen

Ereignisse in ASP.NET UserControl lösen jeden zweiten Klick aus? - asp.net, Ereignisse, Benutzersteuerelemente

Ja, es gibt eine ähnliche Frage Hier. Diese Frage scheint es jedoch nicht zu gebenCode, der daran angehängt ist (obwohl er möglicherweise irgendwann vorhanden ist; ich sehe Antworten, die auf Code verweisen), und die akzeptierte Antwort (und andere Ratschläge) dazu bringen mich nicht dahin, wo ich sein muss.

Ich habe eine ziemlich komplexe und ehrlich gesagtNicht gut gestaltete VB.NET-Webanwendung Ich erweitere sie um eine neue Funktion. Die Kurzform der Funktion besteht darin, dass Administratorbenutzer bestimmte Elemente auf der Startseite neu positionieren können. Eine Neugestaltung für Webparts ist derzeit keine Option Bühne.

Die Verwaltungsseite, die die Größenänderung ermöglicht, verwendet einfache Benutzersteuerelemente, um jedes der "Felder" auf der Startseite darzustellen, die verschoben werden können (verzeihen Sie meine ASCII-Kunst):

+------------+
| Box Title  |
+------------+
|     /     |
|   < X  >   |
|     /     |
+------------+

Die vier Pfeile (und das mittlere X - oder Auge, je nach Sichtbarkeit der Box) sind ImageButtons. Jeder ImageButton"s Click Das Ereignis ist mit einem Code verbunden, der dem folgenden ähnelt:

RaiseEvent WidgetMoved(Me, New WidgetMovedEventArgs(WidgetMoveDirection.Up, widgetIDField.Value))

Die Hosting-Seite (die sich selbst auf einem befindet MasterPage) initiiert diese Benutzersteuerelemente nach dem Binden an die Daten, die bestimmen, wo sie positioniert sind:

For i as Integer = 0 To count
Dim widget As MyWidget = widgets(i) "" widgets is a collection
Dim box as controls_CustomizeWidget = BindWidget(WidgetColumns.Left, i, count, widget) "" This simply uses LoadControl and places the control in one of two placeholders
AddHandler box.WidgetMoved, AddressOf widget_WidgetMoved
AddHandler box.WidgetVisibleChanged, AddressOf widget_WidgetVisibleChanged
Next

Die Methode mit diesem Code wird bei jedem Laden der Seite aufgerufen, unabhängig davon, ob ich mich in einem Postback befinde oder nicht. (Ich "speichere" die Daten live; Sie nehmen eine Änderung vor, sie werden bei diesem Postback in der Datenbank gespeichert und dann neu geladen.)

Jeden andere Nach dem Backback werden die Ereignisse der Benutzersteuerungsschaltfläche nicht ausgelöst. Sie initiieren ein neues Postback und feuern bei diesem zweiten gut. Im Wesentlichen erfordern meine Steuerelemente zwei Klicks, um etwas zu erledigen.

Insbesondere werden die Steuerelemente erneut in der initialisiert Page.Load Event-Handler. Ich habe es ausprobiert PreInit, aber das hat nicht funktioniert, weil der Rest der Seitenstruktur noch nicht erstellt wurde und daher versucht wird, sie in die entsprechende Position zu bringen PlaceHolders schlägt mit a fehl NullReferenceException. Ich habe im Internet gesucht und so etwas nicht gesehen, und ich muss zugeben, dass ich in jedem anderen Szenario Ereignisse aus Benutzersteuerelementen auslöse (z jeden Seite dieser Seite) gibt es keine Probleme. Andererseits ist dies die einzige Seite auf der Site, auf der ein Benutzersteuerelement mit Ereignissen zur Laufzeit dynamisch geladen wird ...

Ich fühle mich im Moment ziemlich dumm. Irgendeine Hilfe, um die Ereignisse jedes Mal zuverlässig anzuheben? Was mache ich falsch?

Antworten:

1 für die Antwort № 1

Ich hatte ein ähnliches Problem, das letztendlich ein Problem warCode im Ereignishandler, der das Ereignis durcheinander gebracht hat und mit den Schaltflächen neu verbunden wurde. Ich glaube, ich habe das Steuerelement neu geladen, nachdem das Klickereignis eine Änderung verursacht hatte, aber den Container der Steuerelemente neu erstellt, anstatt nur neu zu binden.

Ich hoffe, das hilft.


1 für die Antwort № 2

Herausgefunden. In seinem Antworten, bdukes sagt:

Ich glaube, ich habe nachgeladen das Steuerelement nach dem Klickereignis hatte verursachte eine Änderung, wurde aber neu erstellt die Steuerelemente "Container, anstatt nur neu binden.

Dies war hier im Wesentlichen der Fall. Ich habe die Methode aufgerufen, mit der die Steuerelemente ein zweites Mal erstellt wurden, und zwar aus Methoden, die von den Ereignishandlern für diese Steuerelemente aufgerufen wurden. Dadurch wurden die Steuerelemente neu erstellt, und dies schien zu Verwirrung nach dem Backback zu führen. Ich habe dies mit einer guten, altmodischen Spur bestätigt.

Ich habe es geklärt und jetzt habe ich nur noch ein paar andere Fehler zu beseitigen - aber diese kann ich selbst herausarbeiten. Danke, bdukes!


1 für die Antwort № 3

Dieses Verhalten tritt auf, weil das Benutzersteuerelement den Namen nach dem ersten Postback ändert.

Wenn Sie "ClientID" und "UniqueID" überschreiben und beide dazu zwingen, einen vordefinierten Wert zurückzugeben, können Sie dieses Problem beheben (siehe Link Text)