Проблема: ASP.NET запускает изменение события даже в том случае, если не изменить значение элемента управления

Переводы статьи Переводы статьи
Код статьи: 314809 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Проблема

В определенных обстоятельствах, ASP.NET вызывает изменение событий для веб-узла ASP.NET элемента управления, даже в том случае, если элемент управления не следует изменять.

Причина

Некоторые управления, такие какSelectedIndexChangedсобытия вУправления DropDownListэлемент управления илиTextChangedсобытия вTextboxэлемента управления, зависит от регистрации события Change для использования состояния представления. Возникли проблемы при создании этих элементов управления динамически после подключить событие.

ASP.NET отображает страницу в обозреватель, динамически созданные элементы управления не имеют соответствующего события изменения. Так как событие не существует, ASP.NET не сохраняет состояние представления. Это называется Оптимизация состояния просмотра.

При отправке страницы обратно и подключить события, ASP.NET предполагает наличие состояния представления, но обнаружил, что не существует. Это различие запускает событие изменения, даже в том случае, если элемент управления не были изменены.

Решение

Убедитесь, что подключить событие Change для динамически созданных элементов управления, прежде чем ASP.NET отображает страницу. Это гарантирует, что находится в состоянии представления для элемента управления.

Статус

Такое поведение является особенностью данного продукта..

Дополнительная информация

Действия по воспроизведению поведения

Создание веб-формы

  1. Создание нового приложения Visual Basic ASP.NET с именем ChangeFired.
  2. В режиме конструктора, откройте WebForm1. ПеретаскиваниеDataListэлемент управления,Кнопкаэлемент управления иНабор данныхУправление на форму.
  3. В диалоговом окнеДобавление набора данныхдиалоговое окно, нажмите кнопкуНетипизированный набор данныхи выберите командуOk.. Сохранить имена по умолчанию для всех элементов управления.
  4. Изменяет коллекцию таблиц для DataSet1. Добавьте новую таблицу с именем Table1.
  5. Изменение коллекции столбцов для таблицы Table1. Добавьте новый столбец с именем Столбец1.
  6. затем –DataList1, а затем изменитеИсточник данныхСвойствоDataSet1.
  7. Щелкните правой кнопкой мышиDataList1, выберите пунктИзменение шаблонаи выберите командуШаблоны элементов. ПеретаскиваниеУправления DropDownListэлемент управленияШаблон элементав разделе.
  8. затем –DropDownList1, а затем добавьте пять элементов коллекции Items. ЗначениеTextиЗначение:свойства этих элементоводин,два,три,четыре, ипятьсоответственно.
  9. ЗначениеAutoPostBackСвойствоTrueдля DropDownList1.
  10. Изменяет коллекцию привязок данных для DropDownList1. Добавьте следующее выражение пользовательскую привязку кСвойства SelectedIndexСвойство:
    DataBinder.Eval(Container, "DataItem.Column1")
    					
  11. Переключитесь в представление HTML. ЗначениеTraceдля атрибутаTrueВ диалоговом окне@ Pageдирективы, как показано ниже:
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" 
    Inherits="ChangeFired.WebForm1" trace="true" %>
    					

Добавление файла кода программной части

  1. Щелкните правой кнопкой мыши файл WebForm1.aspx и нажмите кнопкуПерейти к коду.
  2. Добавьте следующий код в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
    					
  3. Создать новыйПроцедура 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
    					

Запуск образца

  1. Запустите страницу. Обратите внимание, что динамически созданныйУправления DropDownListэлементы управления содержат состояния просмотра сведений трассировки для элемента управления дерева.

    Это происходит из-за вызоваDataBindдинамически создает методУправления DropDownListэлементы управления, а также подключить обработчик событий послеDataBindвызовPage_LoadСобытие:. Поскольку элементы управления обработчик событий состояния просмотра оптимизация не выполняется.
  2. Нажмите кнопку на странице. Обратите внимание на то, что происходит обратный, а только код внутриPage_LoadЗапускает событие. Находится в состоянии представленияУправления DropDownListэлементы управления, так как обработчик событий связан с элементом управления.
  3. Измените значение в одном изУправления DropDownListэлементы управления. Обратите внимание, что происходит обратный. Кроме того, обратите внимание, что ASP.NET запускаетPage_Loadсобытия и выполняетсяDropDownList1_SelectedIndexChangedСобытие:.
  4. В диалоговом окнеDropDownList1_SelectedIndexChangedсобытие, вызовитеDataBindметод, чтобы создать новыйУправления DropDownListэлементы управления.

    ПосколькуSelectedIndexChangedсобытия не подключен к этим новымУправления DropDownListэлементы управления, ASP.NET использует Оптимизация состояния просмотра и не сохраняет состояние представления для новогоУправления DropDownListэлементы управления.
  5. Просмотр сведений трассировки для элемента управления дерева. Обратите внимание, чтоУправления DropDownListэлементы управления не имеют состояния представления.
  6. Нажмите кнопку на странице. Обратите внимание на то, что происходит обратный и обратите внимание, что выполняется ASP.NETPage_LoadСобытие:. Поскольку можно подключитьSelectedIndexChangedдля событияУправления DropDownListэлементы управления, ASP.NET предполагает наличие состояния представления, которые будут связаны с элементами управления.

    Тем не менее, поскольку состояние представления не существует, ASP.NET запускаетSelectedIndexChangedсобытия, даже если элемент не выбран.

Решение.

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

Свойства

Код статьи: 314809 - Последний отзыв: 23 ноября 2010 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Ключевые слова: 
kbdatabinding kbevent kbprb kbservercontrols kbstate kbwebforms kbmt KB314809 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:314809

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com