/ / Zdarzenia w ASP.NET UserControl podnoszą co drugie kliknięcie? - asp.net, zdarzenia, kontrolki użytkownika

Zdarzenia na ASP.NET UserControl zwiększają każde inne kliknięcie? - asp.net, zdarzenia, kontrolki użytkownika

Tak, jest podobne pytanie tutaj. Jednak to pytanie nie wydaje się miećdołączony do niego kod (choć w pewnym momencie mógł mieć; widzę odpowiedzi nawiązujące do kodu), a zaakceptowana odpowiedź (i inne rady) nie prowadzi mnie tam, gdzie potrzebuję.

Mam dość złożony i szczerze mówiącniezbyt dobrze zaprojektowana aplikacja internetowa VB.NET Rozszerzam ją o nową funkcję. Krótka forma tej funkcji polega na tym, że pozwala ona użytkownikom administracyjnym na zmianę położenia niektórych elementów na stronie głównej. Przeprojektowanie składników Web Part nie jest w tym przypadku możliwe etap.

Strona administracyjna, która pozwala na zmianę rozmiaru, wykorzystuje proste kontrolki użytkownika do reprezentowania każdego z "pól" na stronie głównej, które można przenieść (wybacz moje ascii art):

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

Cztery strzałki (i środkowy X - lub oko, w zależności od widoczności pudełka) to ImageButtons. Każdy ImageButton"s Click zdarzenie jest połączone z kodem podobnym do następującego:

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

Strona hostingowa (która sama znajduje się na MasterPage) inicjuje te kontrolki użytkownika po powiązaniu z danymi, które określają, gdzie się znajdują:

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

Metoda z tym kodem jest wywoływana przy każdym załadowaniu strony, niezależnie od tego, czy jestem w trakcie ogłaszania zwrotnego, czy nie („zapisuję” dane; wprowadzasz zmianę, zapisuje się ona w bazie danych podczas ogłaszania zwrotnego, a następnie ładuje ponownie).

Każdy inny ogłaszanie zwrotne, zdarzenia przycisku sterowania użytkownika nie są uruchamiane. Inicjują nowy postback, a przy tym drugim strzelają dobrze. Zasadniczo moje elementy sterujące wymagają dwóch kliknięć, aby cokolwiek zrobić.

W szczególności ponownie kontrolki są inicjowane w Page.Load moduł obsługi zdarzeń. Próbowałem PreInit, ale to nie zadziałało, ponieważ reszta struktury strony nie została jeszcze zbudowana i dlatego próbuje umieścić je w odpowiednich PlaceHolders zawodzi z NullReferenceException. Szukałem w internecie i nie widziałem czegoś takiego, i muszę przyznać, że w każdym innym scenariuszu, w którym zgłaszam zdarzenia z elementów sterujących użytkownika (takich jak każdy strona tej witryny), nie ma żadnych problemów. Z drugiej strony jest to jedyna strona w witrynie, na której kontrolka użytkownika ze zdarzeniami jest dynamicznie ładowana w czasie wykonywania ...

W tej chwili czuję się dość głupio. Jakakolwiek pomoc w zapewnieniu rzetelnego podniesienia wydarzeń za każdym razem? Co robię źle?

Odpowiedzi:

1 dla odpowiedzi № 1

Miałem podobny problem, który skończył się jakimśkod w programie obsługi zdarzeń, który zepsuł zdarzenie, ponownie łącząc się z przyciskami. Myślę, że to było to, że przeładowywałem formant po tym, jak zdarzenie kliknięcia spowodowało zmianę, ale odtwarzałem kontener formantów, a nie tylko ponowne wiązanie.

Nadzieja, która pomaga.


1 dla odpowiedzi nr 2

Domyśliłam się. W jego odpowiedź, bdukes stwierdza:

Myślę, że to było to, że ładowałem kontrola po kliknięciu spowodował zmianę, ale był odtwarzany kontener kontrolny, a nie tylko ponowne wiązanie.

Tak było w zasadzie w tym przypadku.Wywołałem metodę, która utworzyła kontrolki po raz drugi, z metod wywoływanych przez programy obsługi zdarzeń dla tych kontrolek. To było odtworzenie elementów sterujących i wydawało się, że powodowało to zamieszanie. Potwierdziłem to dobrym, staromodnym Trace.

Wyjaśniłem to, a teraz mam tylko kilka innych błędów do zgniatania - ale te, które mogę rozwiązać samodzielnie. Dzięki, bdukes!


1 dla odpowiedzi nr 3

To zachowanie występuje, ponieważ formant użytkownika zmienia nazwę po pierwszym ogłoszeniu zwrotnym.

Jeśli zastąpisz „ClientID” i „UniqueID”, zmuszając oba do zwrócenia wstępnie zdefiniowanej wartości, możesz rozwiązać ten problem (zobacz tekst linku)