Проблема в том, что вы загружаете данные каждый раз, и это сбрасывает выбранный индекс. Представьте, что это ваш выпадающий список:
zero [selected]
one
two
Затем в клиенте вы изменяете выбранный индекс:
zero
one [selected]
two
Заполняет скрытый ввод __EVENTARGUMENT
новым индексом (1), а скрытый ввод __EVENTTARGET
- id
раскрывающегося списка. Теперь серверный код запускается и перезагружает ваши данные:
zero [selected]
one
two
«ноль» - это выбранное значение, потому что это значение по умолчанию при загрузке данных. Затем ASP.NET ищет __EVENTTARGET
и __EVENTARGUMENT
в Request
, находит ваш выпадающий список id
и находит новый индекс (1). Теперь ваш выпадающий список выглядит так:
zero
one [selected]
two
Поскольку индекс изменился, раскрывающийся список вызывает событие SelectedIndexChanged
, указывающее, что индекс изменился. Очевидно, что эта часть работает, теперь давайте посмотрим, почему выбор первого элемента в списке не вызывает событие.
Теперь давайте скажем, что у нас все еще есть выпадающий список в том состоянии, в котором он только что был (с выбранной единицей и индексом 1). Что происходит, когда мы выбираем первый элемент в списке на клиенте?
__EVENTTARGET
и __EVENTARGUMENT
заполняются id
раскрывающегося списка и новым индексом (0). Затем сервер загружает данные в раскрывающийся список, и теперь раскрывающийся список снова выглядит следующим образом:
zero [selected]
one
two
Обратите внимание, что поскольку вы перезагружали данные до событий, сгенерированных индекс уже установлен в 0, потому что это значение по умолчанию. Теперь, когда ваше событие запускается, а выбранный индекс раскрывающегося списка устанавливается на 0, раскрывающийся список не воспринимает это как изменение, поскольку выбранный индекс (насколько ему известно) не изменился.
Вот как можно решить проблему:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (!Page.IsPostBack)
{
this.DropDownList1.DataTextField = "Text";
this.DropDownList1.DataValueField = "Value";
this.DropDownList1.DataSource = fillQueueDropDown();
this.DropDownList1.DataBind();
}
}
Что это будет делать, это загружать данные в выпадающий список, только если страница не является обратной передачей. Это означает, что ViewState будет поддерживать данные для вас, а также выбранный индекс, поэтому при повторной публикации выпадающий список будет сравнивать новый индекс с индексом, который вы видели в клиенте.