2008-11-21 1 views
0

Да, есть аналогичный вопрос here. Тем не менее, этот вопрос, похоже, не привязан к нему (хотя он может быть в какой-то момент, я вижу ответы, ссылающиеся на код), и принятый ответ (и другие рекомендации) на него не дает мне, где мне нужно быть.События в ASP.NET UserControl повышают каждый другой клик?

У меня довольно сложное и откровенно не-продуманное веб-приложение VB.NET, которое я расширяю с новой функцией. Краткая форма функции заключается в том, что она позволяет административным пользователям перемещать определенные элементы на главной странице. Редизайн для веб-частей на данном этапе не является вариантом.

Административная страница, которая позволяет изменение размеров использует простые пользовательские элементы управления для представления каждого из «коробки» на домашней странице, которую можно переместить (простите мое ASCii искусство):

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

Четыре стрелки (и центр X - или глаз, в зависимости от видимости коробки) - ImageButton s. Каждый Click событие ImageButton «ы подключен к код, подобный следующему:

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

хостинг-страницы (которое само по MasterPage) инициирует эти пользовательские элементы управления после связывания с данными, который определяет, где они расположены:

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 

Метод с этим кодом вызывается при каждой загрузке страницы, независимо от того, включен я или нет. (Я «сохраняю» данные, вы делаете изменения, они сохраняются в базе данных при этой обратной передаче, а затем перезагружаются.)

Другие postback, события кнопки управления пользователя не срабатывают. Они инициируют новую ретрансляцию, и на этой второй они срабатывают нормально. Поэтому, по сути, мои элементы управления требуют двух щелчков, чтобы что-то сделать.

В частности, элементы управления инициализируются в обработчике событий Page.Load. Я опробовал PreInit, но это не сработало, потому что остальная структура страницы еще не построена, и поэтому попытка поместить их в соответствующие PlaceHolder s с ошибкой с NullReferenceException. Я искал в Интернете и не видел ничего подобного, и я должен признать, что в каждом другом сценарии, когда я поднимаю события из пользовательских элементов управления (например, каждую страницу этого сайта), проблем нет. С другой стороны, это единственная страница на сайте, где пользовательский контроль с событиями динамически загружается во время выполнения ...

Я чувствую себя довольно глупым на данный момент. Любая помощь в получении событий для повышения надежности, каждый раз? Что я делаю не так?

ответ

1

У меня была аналогичная проблема, которая закончилась тем, что была некоторым кодом в обработчике событий, который перепутал событие, связанное с повторным подключением к кнопкам. Я думаю, что это было то, что я перезагружал элемент управления после того, как событие click вызвало изменение, но было воссоздание контейнера элементов управления, а не просто восстановление.

Надеюсь, что это поможет.

1

Выяснил это.В своем answer, bdukes гласит:

Я думаю, что это было то, что я перегрузочный контроля после того, как событие щелчка было вызвало изменение, но воссоздаю контейнер элементов управления, а не просто подмены.

Это было по существу здесь. Я вызывал метод, который создал элементы управления во второй раз, из методов, вызываемых обработчиками событий для указанных элементов управления. Это было воссоздание элементов управления, и это, казалось, вызывало путаницу после обратной связи. Я подтвердил это с помощью доброй старомодной трассы.

Я прояснился, и теперь у меня есть еще несколько ошибок для сквоша, но я могу самостоятельно разобраться. Спасибо, bdukes!

0

Это происходит потому, что пользовательский элемент управления меняет имя после первой обратной передачи.

Если вы переопределяете «ClientID» и «UniqueID» принуждая и возвращать заданное значение, вы можете решить эти проблемы (см link text)