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 ImageButton
s. 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 PlaceHolder
s 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 № 1Miał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)