События изменений возникают при каждой обратной передаче, для которой они актуальны - как описано в разделе MSDN " Модель событий управления веб-сервером ASP.NET ."
Изменение событий в элементах управления HTML-сервера
и элементы управления веб-сервера, такие как
Контроль TextBox, не сразу
вызвать пост. Вместо этого они подняты
в следующий раз, когда появится сообщение .
Когда пользователи нажимают кнопку «Редактировать исполнителя», ASP.NET думает, что lbLinks.SelectedIndex
изменился, и вызывает свой обработчик SelectedIndexChanged
.
Причина ASP.NET считает, что индекс изменился: при первой загрузке страницы lbLinks
не имеет выбранного индекса (или значения), если вы не укажете иначе, явно установив его , Пока вы не сделаете это, выбранный индекс равен -1, а его выбранное значение - пустая строка. Выбранное значение (в данном случае пустая строка) записывается для просмотра состояния при отображении страницы , чтобы ASP.NET мог определить, изменилось ли значение в обратных передачах .
Вы можете наблюдать это во время отладки, проверяя выбранные индексы и значения в ваших списках перед рендерингом, или вы можете использовать один из сетевых декодеров состояния просмотра (, как этот ), чтобы увидеть, что находится на вашей странице когда он впервые написан (хотя, чтобы прочитать это, вам нужно знать о структуре данных о состоянии сериализованного представления ).
При следующей публикации обратно элемент HTML <select>
lbLinks
имеет непустое значение и отправляется как часть данных публикации. Посмотрите на Request.Form["lbLinks"]
, и вы увидите, что оно равно lbLinks.Items[0].Value
.
ASP.NET отображает опубликованное значение в lbLinks.SelectedValue
, но также знает, что выбранное значение раньше было пустой строкой - оно получает старое значение из состояния просмотра. Поскольку эти два значения различны, процесс вызывает событие изменения выбранного индекса элемента управления, вызывая нежелательное поведение, которое вы наблюдали.
Как подсказал Бун , решение состоит в том, чтобы всегда явно устанавливать SelectedIndex
для всех ваших ListBox
элементов управления, когда вы используете событие OnSelectedIndexChanged
, даже если вы просто устанавливаете индекс до нуля.
(Параметр AutoPostBack представляет собой несвязанную красную сельдь. Если вы удалите ее из обоих списков, их события OnSelectedIndexChanged
будут срабатывать каждый раз, когда вы нажимаете кнопку.)