События на ASP.NET UserControl вызывают каждый второй щелчок? - PullRequest
1 голос
/ 21 ноября 2008

Да, есть похожий вопрос здесь . Тем не менее, к этому вопросу, похоже, не прикреплен код (хотя он может иметь место в какой-то момент; я вижу ответы, ссылающиеся на код), и принятый ответ (и другие советы) по нему не дают мне того, что мне нужно быть.

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

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

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

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

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 22 ноября 2008

Разобрался. В своем ответе Бдукес заявляет:

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

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

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

1 голос
/ 30 марта 2009

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

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

1 голос
/ 21 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...