В определенных обстоятельствах, ASP.NET вызывает изменение событий для веб-узла ASP.NET элемента управления, даже в том случае, если элемент управления не следует изменять.
Некоторые управления, такие какSelectedIndexChangedсобытия вУправления DropDownListэлемент управления илиTextChangedсобытия вTextboxэлемента управления, зависит от регистрации события Change для использования состояния представления. Возникли проблемы при создании этих элементов управления динамически после подключить событие.
ASP.NET отображает страницу в обозреватель, динамически созданные элементы управления не имеют соответствующего события изменения. Так как событие не существует, ASP.NET не сохраняет состояние представления. Это называется Оптимизация состояния просмотра.
При отправке страницы обратно и подключить события, ASP.NET предполагает наличие состояния представления, но обнаружил, что не существует. Это различие запускает событие изменения, даже в том случае, если элемент управления не были изменены.
Убедитесь, что подключить событие Change для динамически созданных элементов управления, прежде чем ASP.NET отображает страницу. Это гарантирует, что находится в состоянии представления для элемента управления.
Создание нового приложения Visual Basic ASP.NET с именем ChangeFired.
В режиме конструктора, откройте WebForm1. ПеретаскиваниеDataListэлемент управления,Кнопкаэлемент управления иНабор данныхУправление на форму.
В диалоговом окнеДобавление набора данныхдиалоговое окно, нажмите кнопкуНетипизированный набор данныхи выберите командуOk.. Сохранить имена по умолчанию для всех элементов управления.
Изменяет коллекцию таблиц для DataSet1. Добавьте новую таблицу с именем Table1.
Изменение коллекции столбцов для таблицы Table1. Добавьте новый столбец с именем Столбец1.
затем –DataList1, а затем изменитеИсточник данныхСвойствоDataSet1.
затем –DropDownList1, а затем добавьте пять элементов коллекции Items. ЗначениеTextиЗначение:свойства этих элементоводин,два,три,четыре, ипятьсоответственно.
Щелкните правой кнопкой мыши файл WebForm1.aspx и нажмите кнопкуПерейти к коду.
Добавьте следующий код вPage_LoadСобытие::
DataSet1.Tables(0).Rows.Add(New Object() {"1"})
DataSet1.Tables(0).Rows.Add(New Object() {"2"})
DataSet1.Tables(0).Rows.Add(New Object() {"3"})
DataSet1.Tables(0).Rows.Add(New Object() {"4"})
If Not IsPostBack Then
DataBind()
End If
Dim objItem As DataListItem
For Each objItem In DataList1.Items
AddHandler CType(objItem.FindControl("DropDownList1"), _
DropDownList).SelectedIndexChanged, AddressOf DropDownList1_SelectedIndexChanged
If Not objItem.FindControl("DropDownList1") Is Nothing Then
Trace.Write("Added SelectedIndexChanged Handler")
End If
Next
Создать новыйПроцедура SubОписанная ниже процедураPage_Loadдля обработки событияSelectedIndexChangedсобытия, как показано ниже:
Private Sub DropDownList1_SelectedIndexChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
DataBind()
Trace.Write("SelectedIndexChanged, DataBind()")
'Uncomment the following code to resolve this problem.
'Dim objItem As DataListItem
'For Each objItem In DataList1.Items
' AddHandler CType(objItem.FindControl("DropDownList1"), _
' DropDownList).SelectedIndexChanged, AddressOf DropDownList1_SelectedIndexChanged
'Next
End Sub
Запуск образца
Запустите страницу. Обратите внимание, что динамически созданныйУправления DropDownListэлементы управления содержат состояния просмотра сведений трассировки для элемента управления дерева.
Это происходит из-за вызоваDataBindдинамически создает методУправления DropDownListэлементы управления, а также подключить обработчик событий послеDataBindвызовPage_LoadСобытие:. Поскольку элементы управления обработчик событий состояния просмотра оптимизация не выполняется.
Нажмите кнопку на странице. Обратите внимание на то, что происходит обратный, а только код внутриPage_LoadЗапускает событие. Находится в состоянии представленияУправления DropDownListэлементы управления, так как обработчик событий связан с элементом управления.
Измените значение в одном изУправления DropDownListэлементы управления. Обратите внимание, что происходит обратный. Кроме того, обратите внимание, что ASP.NET запускаетPage_Loadсобытия и выполняетсяDropDownList1_SelectedIndexChangedСобытие:.
В диалоговом окнеDropDownList1_SelectedIndexChangedсобытие, вызовитеDataBindметод, чтобы создать новыйУправления DropDownListэлементы управления.
ПосколькуSelectedIndexChangedсобытия не подключен к этим новымУправления DropDownListэлементы управления, ASP.NET использует Оптимизация состояния просмотра и не сохраняет состояние представления для новогоУправления DropDownListэлементы управления.
Просмотр сведений трассировки для элемента управления дерева. Обратите внимание, чтоУправления DropDownListэлементы управления не имеют состояния представления.
Нажмите кнопку на странице. Обратите внимание на то, что происходит обратный и обратите внимание, что выполняется ASP.NETPage_LoadСобытие:. Поскольку можно подключитьSelectedIndexChangedдля событияУправления DropDownListэлементы управления, ASP.NET предполагает наличие состояния представления, которые будут связаны с элементами управления.
Тем не менее, поскольку состояние представления не существует, ASP.NET запускаетSelectedIndexChangedсобытия, даже если элемент не выбран.
Решение.
Чтобы устранить эту проблему, удалите метки комментария в кодеDropDownList1_SelectedIndexChangedсобытия так, чтобы подключить обработчики событий с помощью создаваемых элементов управления.
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Спасибо! Благодаря вашему отзыву мы сможем сделать справочные материалы еще лучше. Чтобы воспользоваться дополнительными возможностями поддержки, посетите домашнюю страницу центра справки и поддержки.