Запуск Javascript после установки выбранного элемента управления

Простое приложение ASP.NET.

У меня есть два раскрывающихся элемента управления. В первом выпадающем меню у меня есть onChangeсобытие JavaScript . JavaScript включает второе раскрывающееся меню и удаляет из него значение (значение, выбранное в первом раскрывающемся списке). Если щелкнуть пустое первое значение раскрывающегося списка, то второе раскрывающееся меню будет отключено (и параметры будут сброшены).

У меня также есть код в OnPreRenderметоде, который будет включать или отключать второй раскрывающийся список в зависимости от значения первого раскрывающегося списка. Это делается для того, чтобы значение первого раскрывающегося списка можно было выбрать в коде (загрузка пользовательских настроек).

Моя проблема:

  1. Пользователь выбирает что-то в первом раскрывающемся списке. Второй раскрывающийся список станет активным через JavaScript.
  2. Затем они изменяют третий выпадающий список, который инициирует обратную запись. После обратной записи раскрывающиеся списки находятся в правильном состоянии (выбрано первое значение, второе раскрывающееся меню включено).
  3. Если они затем нажимают кнопку «Назад», второе раскрывающееся меню больше не будет включено, хотя это должно быть, поскольку в первом раскрывающемся списке что-то выбрано.

Я пытался добавить сценарий запуска (который будет установить правильное состояние второго выпадающий) через ClientScript.RegisterStartupScript, однако , когда это вызывается первым выпадающий имеет selectedIndexиз 0, а не то , что он на самом деле. Я предполагаю, что значение выбора устанавливается после моего стартового скрипта (но все равно не вызывает onChangeскрипт).

Есть идеи, что попробовать?

13.08.2008 00:11:03
2 ОТВЕТА
РЕШЕНИЕ
<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    protected void indexChanged(object sender, EventArgs e)
    {
        Label1.Text = " I did something! ";
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Test Page</title>
</head>
<body>
    <script type="text/javascript">
        function firstChanged() {
            if(document.getElementById("firstSelect").selectedIndex != 0)
                document.getElementById("secondSelect").disabled = false;
            else
                document.getElementById("secondSelect").disabled = true;
        }
    </script>
    <form id="form1" runat="server">
    <div>
        <select id="firstSelect" onchange="firstChanged()">
            <option value="0"></option>
            <option value="1">One</option>
            <option value="2">Two</option>
            <option value="3">Three</option>
        </select>
        <select id="secondSelect" disabled="disabled">
            <option value="1">One</option>
            <option value="2">Two</option>
            <option value="3">Three</option>
        </select>
        <asp:DropDownList ID="DropDownList1" AutoPostBack="true" OnSelectedIndexChanged="indexChanged" runat="server">
            <asp:ListItem Text="One" Value="1"></asp:ListItem>
            <asp:ListItem Text="Two" Value="2"></asp:ListItem>    
        </asp:DropDownList>
        <asp:Label ID="Label1" runat="server"></asp:Label>
    </div>
    </form>
    <script type="text/javascript">
        window.onload = function() {firstChanged();}
    </script>
</body>
</html>

Редактировать: заменен весь код. Это должно работать даже в вашем пользовательском контроле. Я считаю, что Register.ClientScriptBlock не работает, потому что код, который вы пишете в этом блоке, выполняется перед вызовом window.onload. И я предполагаю (я не уверен в этом), что для объектов DOM не установлены значения в это время. И именно поэтому вы получаете selectedIndex как всегда 0.

2
13.08.2008 01:15:47

Если второе раскрывающееся меню изначально включено с помощью javascript (я предполагаю, что это происходит во время обмена javascript, поскольку вы не указали), то нажатие кнопки «Назад» для перезагрузки предыдущего постбэка никогда не включит его.

Смешивание ASP.NET с классическим JavaScript может быть проблематичным. Возможно, вы захотите взглянуть на реализацию Ajax ASP.NET (или сторонний элемент управления AjaxPanel, если вы вынуждены использовать более старую версию ASP.NET). Это даст вам поведение, которое вы хотите через чистый C #, не заставляя вас прибегать к javascript hackery-pokery.

4
13.08.2008 00:16:51