Выпадающий список OnSelectedIndexChanged не срабатывает

Событие OnSelectedIndexChanged не срабатывает для моего раскрывающегося списка. Все форумы, на которые я смотрел, говорили мне добавить AutoPostBack="true", но это не изменило результатов.

HTML:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:Label ID="Label1" runat="server" Text="Current Time:  " /><br />
      <asp:Label ID="lblCurrent" runat="server" Text="Label" /><br /><br />
      <asp:DropDownList ID="cboSelectedLocation" runat="server" AutoPostBack="true" OnSelectedIndexChanged="cboSelectedLocation_SelectedIndexChanged"  /><br /><br />
      <asp:Label ID="lblSelectedTime" runat="server" Text="Label" />
    </div>
    </form>
</body>
</html>

Код позади:

public partial class _Default : Page 
{
    string _sLocation = string.Empty;
    string _sCurrentLoc = string.Empty;
    TimeSpan _tsSelectedTime;

    protected void Page_Load(object sender, EventArgs e)
    {
      AddTimeZones();
      cboSelectedLocation.Focus();
      lblCurrent.Text = "Currently in " + _sCurrentLoc + Environment.NewLine + DateTime.Now;
      lblSelectedTime.Text = _sLocation + ":" + Environment.NewLine + DateTime.UtcNow.Add(_tsSelectedTime);
    }

    //adds all timezone displaynames to combobox
    //defaults combo location to seoul, South Korea
    //defaults current location to current location
    private void AddTimeZones()
    {
      foreach(TimeZoneInfo tz in System.TimeZoneInfo.GetSystemTimeZones())
      {
        string s = tz.DisplayName;
        cboSelectedLocation.Items.Add(s);
        if (tz.StandardName  == "Korea Standard Time") cboSelectedLocation.Text = s;
        if (tz.StandardName == System.TimeZone.CurrentTimeZone.StandardName) _sCurrentLoc = tz.StandardName;
      }
    }

    //changes timezone name and time depending on what is selected in the cbobox.
    protected void cboSelectedLocation_SelectedIndexChanged(object sender, EventArgs e)
    {
      foreach (TimeZoneInfo tz in System.TimeZoneInfo.GetSystemTimeZones())
      {
        if (cboSelectedLocation.Text == tz.DisplayName)
        {
          _sLocation = tz.StandardName;
          _tsSelectedTime = tz.GetUtcOffset(DateTime.UtcNow);
        }
      }
    }
}

Какой-нибудь совет, на что обратить внимание начинающему asp-кодировщику?

EDIT: добавлен дополнительный код


Грэм Кларк был прав, нуждаясь в !Page.IsPostBack, но теперь это что-то с глобальными переменными, которые я установил. Этот код был перетащен из проекта С#, поэтому я предполагаю, что есть некоторые проблемы с глобальными переменными и asp.net. Мне пора провести дополнительное исследование, чтобы понять, чем отличаются глобальные переменные в автономной программе от веб-программы.


person Jim    schedule 08.06.2010    source источник
comment
Вы уверены, что он не стреляет? Вы установили точку останова за пределами foreach? Это может быть не связанная с этим проблема, которая заставляет вас думать, что он не срабатывает.   -  person ctorx    schedule 08.06.2010
comment
Как вы привязываете данные к выпадающему списку? Ваша разметка показывает пустой раскрывающийся список. Вы привязываете к нему значения в коде?   -  person KP.    schedule 08.06.2010
comment
@matthew: Да, он не срабатывает вне цикла foreach. @KP: я устанавливаю информацию о часовом поясе в коде позади.   -  person Jim    schedule 08.06.2010
comment
Он также не срабатывает при динамическом добавлении часовых поясов.   -  person Jim    schedule 08.06.2010


Ответы (1)


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

Допустим, вы привязываете данные к раскрывающемуся списку в событии Page_Load. Вы хотите сделать это так:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // bind drop-down list here
    }
}
person Graham Clark    schedule 08.06.2010